From 6d7aa2b531088c3a277911534179975eb2622954 Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Wed, 24 Jan 2018 15:40:29 -0200 Subject: [PATCH] getlogin_r: switch Linux variant to struct scratch_buffer [BZ #18023] * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid): Use scratch_buffer instead of extend_alloca. Reviewed-by: Adhemerval Zanella --- ChangeLog | 6 +++++ sysdeps/unix/sysv/linux/getlogin_r.c | 34 +++++++++++----------------- 2 files changed, 19 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index e6e29b1e11..a30eeead7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2018-02-06 Florian Weimer + + [BZ #18023] + * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid): + Use scratch_buffer instead of extend_alloca. + 2018-02-06 Zack Weinberg * libio/stdio.h: Don't define getc or putc as macros. diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c b/sysdeps/unix/sysv/linux/getlogin_r.c index 84c51d0ecd..73ea14c8f9 100644 --- a/sysdeps/unix/sysv/linux/getlogin_r.c +++ b/sysdeps/unix/sysv/linux/getlogin_r.c @@ -18,6 +18,7 @@ #include #include #include +#include #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; }