diff options
author | Florian Weimer <fweimer@redhat.com> | 2018-01-24 15:40:29 -0200 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2018-02-06 09:32:02 -0200 |
commit | 6d7aa2b531088c3a277911534179975eb2622954 (patch) | |
tree | d9215f89745fb4ea0191d4da5dda4a1782a26669 /sysdeps | |
parent | 71aa429b029fdb6f9e65d44050388b51eca460d6 (diff) | |
download | glibc-6d7aa2b531088c3a277911534179975eb2622954.tar.gz glibc-6d7aa2b531088c3a277911534179975eb2622954.tar.xz glibc-6d7aa2b531088c3a277911534179975eb2622954.zip |
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 <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/sysv/linux/getlogin_r.c | 34 |
1 files changed, 13 insertions, 21 deletions
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 <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; } |