getlogin_r: switch Linux variant to struct scratch_buffer
authorFlorian Weimer <fweimer@redhat.com>
Wed, 24 Jan 2018 17:40:29 +0000 (15:40 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Tue, 6 Feb 2018 11:32:02 +0000 (09:32 -0200)
[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>
ChangeLog
sysdeps/unix/sysv/linux/getlogin_r.c

index e6e29b1..a30eeea 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-02-06  Florian Weimer <fweimer@redhat.com>
+
+       [BZ #18023]
+       * sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid):
+       Use scratch_buffer instead of extend_alloca.
+
 2018-02-06  Zack Weinberg  <zackw@panix.com>
 
        * libio/stdio.h: Don't define getc or putc as macros.
index 84c51d0..73ea14c 100644 (file)
@@ -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;
 }