diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | nscd/netgroupcache.c | 37 |
3 files changed, 12 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog index 703b0ee00f..a61bfde918 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-01-16 Siddhesh Poyarekar <siddhesh@redhat.com> + + [BZ #16453] + * nscd/netgroupcache.c (addgetnetgrentX): Don't use alloca. + 2014-01-15 Adhemerval Zanella <azanella@linux.vnet.ibm.com> * sysdeps/powerpc/sotruss-lib.c: New file: sotruss-lib.so diff --git a/NEWS b/NEWS index f406522882..248f2c30ad 100644 --- a/NEWS +++ b/NEWS @@ -25,7 +25,7 @@ Version 2.19 16151, 16153, 16167, 16172, 16195, 16214, 16245, 16271, 16274, 16283, 16289, 16293, 16314, 16316, 16330, 16337, 16338, 16356, 16365, 16366, 16369, 16372, 16375, 16379, 16384, 16385, 16386, 16387, 16390, 16394, - 16400, 16407, 16408, 16414. + 16400, 16407, 16408, 16414, 16453. * Slovenian translations for glibc messages have been contributed by the Translation Project's Slovenian team of translators. diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c index 9fc16640ae..58234b1492 100644 --- a/nscd/netgroupcache.c +++ b/nscd/netgroupcache.c @@ -141,7 +141,6 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, size_t buffilled = sizeof (*dataset); char *buffer = NULL; size_t nentries = 0; - bool use_malloc = false; size_t group_len = strlen (key) + 1; union { @@ -159,7 +158,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, } memset (&data, '\0', sizeof (data)); - buffer = alloca (buflen); + buffer = xmalloc (buflen); first_needed.elem.next = &first_needed.elem; memcpy (first_needed.elem.name, key, group_len); data.needed_groups = &first_needed.elem; @@ -241,21 +240,8 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, if (buflen - req->key_len - bufused < needed) { - size_t newsize = MAX (2 * buflen, - buflen + 2 * needed); - if (use_malloc || newsize > 1024 * 1024) - { - buflen = newsize; - char *newbuf = xrealloc (use_malloc - ? buffer - : NULL, - buflen); - - buffer = newbuf; - use_malloc = true; - } - else - extend_alloca (buffer, buflen, newsize); + buflen += MAX (buflen, 2 * needed); + buffer = xrealloc (buffer, buflen); } nhost = memcpy (buffer + bufused, @@ -322,18 +308,8 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, } else if (status == NSS_STATUS_UNAVAIL && e == ERANGE) { - size_t newsize = 2 * buflen; - if (use_malloc || newsize > 1024 * 1024) - { - buflen = newsize; - char *newbuf = xrealloc (use_malloc - ? buffer : NULL, buflen); - - buffer = newbuf; - use_malloc = true; - } - else - extend_alloca (buffer, buflen, newsize); + buflen *= 2; + buffer = xrealloc (buffer, buflen); } } @@ -478,8 +454,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, } out: - if (use_malloc) - free (buffer); + free (buffer); *resultp = dataset; |