diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | 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,6 +1,12 @@ 2018-06-25 Florian Weimer <fweimer@redhat.com> [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 <fweimer@redhat.com> + + [BZ #18023] * nss/getent.c (initgroups_keys): Use dynarray instead of extend_alloca. 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 <http://www.gnu.org/licenses/>. */ -#include <alloca.h> #include <errno.h> #include <grp.h> #include <nss.h> @@ -25,6 +24,7 @@ #include <sys/param.h> #include <stdbool.h> #include <stdlib.h> +#include <scratch_buffer.h> 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); |