This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Mon, Mar 24, 2014 at 03:04:23PM +0100, Andreas Schwab wrote: > # ip li add name dummy0 type dummy > # site_id=$(head -c6 /dev/urandom | od -tx2 -An | tr ' ' ':') > # for ((i = 0; i < 65536; i++)) do > > ip ad ad $(printf fd80$site_id::%04x $i)/128 dev dummy0 > > done > # (ulimit -s 900; getent ahosts localhost) > # ip li de dummy0 This needs a more verbose description for the commit log. The change itself looks OK to me. Thanks, Siddhesh > [BZ #16002] > * sysdeps/unix/sysv/linux/check_pf.c (make_request): Use > alloca_account and account alloca use for struct in6ailist. > --- > sysdeps/unix/sysv/linux/check_pf.c | 32 ++++++++++++++++++++++++++++---- > 1 file changed, 28 insertions(+), 4 deletions(-) > > diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c > index 5c8e75a..6d8468d 100644 > --- a/sysdeps/unix/sysv/linux/check_pf.c > +++ b/sysdeps/unix/sysv/linux/check_pf.c > @@ -139,9 +139,10 @@ make_request (int fd, pid_t pid) > #endif > bool use_malloc = false; > char *buf; > + size_t alloca_used = 0; > > if (__libc_use_alloca (buf_size)) > - buf = alloca (buf_size); > + buf = alloca_account (buf_size, alloca_used); > else > { > buf = malloc (buf_size); > @@ -163,6 +164,7 @@ make_request (int fd, pid_t pid) > { > struct in6addrinfo info; > struct in6ailist *next; > + bool use_malloc; > } *in6ailist = NULL; > size_t in6ailistlen = 0; > bool seen_ipv4 = false; > @@ -239,7 +241,19 @@ make_request (int fd, pid_t pid) > } > } > > - struct in6ailist *newp = alloca (sizeof (*newp)); > + struct in6ailist *newp; > + if (__libc_use_alloca (alloca_used + sizeof (*newp))) > + { > + newp = alloca_account (sizeof (*newp), alloca_used); > + newp->use_malloc = false; > + } > + else > + { > + newp = malloc (sizeof (*newp)); > + if (newp == NULL) > + goto out_fail; > + newp->use_malloc = true; > + } > newp->info.flags = (((ifam->ifa_flags > & (IFA_F_DEPRECATED > | IFA_F_OPTIMISTIC)) > @@ -286,7 +300,10 @@ make_request (int fd, pid_t pid) > do > { > result->in6ai[--in6ailistlen] = in6ailist->info; > - in6ailist = in6ailist->next; > + struct in6ailist *next = in6ailist->next; > + if (in6ailist->use_malloc) > + free (in6ailist); > + in6ailist = next; > } > while (in6ailist != NULL); > } > @@ -302,7 +319,14 @@ make_request (int fd, pid_t pid) > free (buf); > return result; > > -out_fail: > + out_fail: > + while (in6ailist != NULL) > + { > + struct in6ailist *next = in6ailist->next; > + if (in6ailist->use_malloc) > + free (in6ailist); > + in6ailist = next; > + } > if (use_malloc) > free (buf); > return NULL; > -- > 1.9.1 > > > -- > Andreas Schwab, SUSE Labs, schwab@suse.de > GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 > "And now for something completely different."
Attachment:
pgpDVmofv5Fbl.pgp
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |