From 43b1048ab9418e902aac8c834a7a9a88c501620a Mon Sep 17 00:00:00 2001 From: Florian Weimer Date: Mon, 25 Jun 2018 19:29:11 +0200 Subject: nss_files: Use struct scratch_buffer instead of extend_alloca [BZ #18023] --- ChangeLog | 6 ++++++ nss/nss_files/files-initgroups.c | 32 ++++++++++---------------------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/ChangeLog b/ChangeLog index b015935195..f8d28b496e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2018-06-25 Florian Weimer + + [BZ #18023] + * nss/nss_files/files-initgroups.c (_nss_files_initgroups_dyn): + Use struct scratch_buffer instead of extend_alloca. + 2018-06-25 Florian Weimer [BZ #18023] diff --git a/nss/nss_files/files-initgroups.c b/nss/nss_files/files-initgroups.c index 8af0d4d36a..b441d8345f 100644 --- a/nss/nss_files/files-initgroups.c +++ b/nss/nss_files/files-initgroups.c @@ -16,7 +16,6 @@ License along with the GNU C Library; if not, see . */ -#include #include #include #include @@ -25,6 +24,7 @@ #include #include #include +#include enum nss_status _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, @@ -46,9 +46,8 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, enum nss_status status = NSS_STATUS_SUCCESS; bool any = false; - size_t buflen = 1024; - void *buffer = alloca (buflen); - bool buffer_use_malloc = false; + struct scratch_buffer tmpbuf; + scratch_buffer_init (&tmpbuf); gid_t *groups = *groupsp; @@ -67,26 +66,16 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, } struct group grp; - int res = _nss_files_parse_grent (line, &grp, buffer, buflen, errnop); + int res = _nss_files_parse_grent (line, &grp, + tmpbuf.data, tmpbuf.length, errnop); if (res == -1) { - size_t newbuflen = 2 * buflen; - if (buffer_use_malloc || ! __libc_use_alloca (buflen + newbuflen)) + if (!scratch_buffer_grow (&tmpbuf)) { - void *newbuf = realloc (buffer_use_malloc ? buffer : NULL, - newbuflen); - if (newbuf == NULL) - { - *errnop = ENOMEM; - status = NSS_STATUS_TRYAGAIN; - goto out; - } - buffer = newbuf; - buflen = newbuflen; - buffer_use_malloc = true; + *errnop = ENOMEM; + status = NSS_STATUS_TRYAGAIN; + goto out; } - else - buffer = extend_alloca (buffer, buflen, newbuflen); /* Reread current line, the parser has clobbered it. */ fsetpos (stream, &pos); continue; @@ -132,8 +121,7 @@ _nss_files_initgroups_dyn (const char *user, gid_t group, long int *start, out: /* Free memory. */ - if (buffer_use_malloc) - free (buffer); + scratch_buffer_free (&tmpbuf); free (line); fclose (stream); -- cgit 1.4.1