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>
This commit is contained in:
Florian Weimer 2018-01-24 15:40:29 -02:00 committed by Adhemerval Zanella
parent 71aa429b02
commit 6d7aa2b531
2 changed files with 19 additions and 21 deletions

View File

@ -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.

View 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;
}