[v2,09/12] getlogin_r: switch Linux variant to struct scratch_buffer
Commit Message
From: Florian Weimer <fweimer@redhat.com>
[BZ #18023]
* sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid):
Use scratch_buffer instead of extend_alloca.
---
ChangeLog | 6 ++++++
sysdeps/unix/sysv/linux/getlogin_r.c | 34 +++++++++++++---------------------
2 files changed, 19 insertions(+), 21 deletions(-)
Comments
On 02/05/2018 02:27 PM, Adhemerval Zanella wrote:
> From: Florian Weimer <fweimer@redhat.com>
>
> [BZ #18023]
> * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid):
> Use scratch_buffer instead of extend_alloca.
Still looks okay to me. Do you want me to commit it?
Thanks,
Florian
On 05/02/2018 12:05, Florian Weimer wrote:
> On 02/05/2018 02:27 PM, Adhemerval Zanella wrote:
>> From: Florian Weimer <fweimer@redhat.com>
>>
>> [BZ #18023]
>> * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid):
>> Use scratch_buffer instead of extend_alloca.
>
> Still looks okay to me. Do you want me to commit it?
>
> Thanks,
> Florian
I can do it for you.
On 02/05/2018 04:06 PM, Adhemerval Zanella wrote:
>
>
> On 05/02/2018 12:05, Florian Weimer wrote:
>> On 02/05/2018 02:27 PM, Adhemerval Zanella wrote:
>>> From: Florian Weimer <fweimer@redhat.com>
>>>
>>> [BZ #18023]
>>> * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid):
>>> Use scratch_buffer instead of extend_alloca.
>>
>> Still looks okay to me. Do you want me to commit it?
>>
>> Thanks,
>> Florian
>
> I can do it for you.
Okay, please do.
Thanks,
Florian
@@ -18,6 +18,7 @@
#include <pwd.h>
#include <unistd.h>
#include <not-cancel.h>
+#include <scratch_buffer.h>
#define STATIC static
static int getlogin_r_fd0 (char *name, size_t namesize);
@@ -54,29 +55,22 @@ __getlogin_r_loginuid (char *name, size_t namesize)
endp == uidbuf || *endp != '\0'))
return -1;
- size_t buflen = 1024;
- char *buf = alloca (buflen);
- bool use_malloc = false;
struct passwd pwd;
struct passwd *tpwd;
int result = 0;
int res;
+ struct scratch_buffer tmpbuf;
+ scratch_buffer_init (&tmpbuf);
- while ((res = __getpwuid_r (uid, &pwd, buf, buflen, &tpwd)) == ERANGE)
- if (__libc_use_alloca (2 * buflen))
- buf = extend_alloca (buf, buflen, 2 * buflen);
- else
- {
- buflen *= 2;
- char *newp = realloc (use_malloc ? buf : NULL, buflen);
- if (newp == NULL)
- {
- result = ENOMEM;
- goto out;
- }
- buf = newp;
- use_malloc = true;
- }
+ while ((res = __getpwuid_r (uid, &pwd,
+ tmpbuf.data, tmpbuf.length, &tpwd)) == ERANGE)
+ {
+ if (!scratch_buffer_grow (&tmpbuf))
+ {
+ result = ENOMEM;
+ goto out;
+ }
+ }
if (res != 0 || tpwd == NULL)
{
@@ -95,9 +89,7 @@ __getlogin_r_loginuid (char *name, size_t namesize)
memcpy (name, pwd.pw_name, needed);
out:
- if (use_malloc)
- free (buf);
-
+ scratch_buffer_free (&tmpbuf);
return result;
}