From: Siddhesh Poyarekar Date: Thu, 10 Jul 2014 08:45:16 +0000 (+0530) Subject: Fix crash when system has no ipv6 address [BZ #17125] X-Git-Tag: glibc-2.20~116 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d62aa75af1941fca6f07e107afc447b7b248e340;p=thirdparty%2Fglibc.git Fix crash when system has no ipv6 address [BZ #17125] Here's an updated patch to fix the crash in bug-ga2 when the system has no configured ipv6 address. I have taken a different approach of using libc_freeres_fn instead of the libc_freeres_ptr since the former gives better control over what is freed; we need that since cache may or may not be allocated using malloc. Verified that bug-ga2 works correctly in both cases and does not have memory leaks in either of them. --- diff --git a/ChangeLog b/ChangeLog index f5b5599486c..72e9cf9e280 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2014-07-10 Siddhesh Poyarekar + [BZ #17125] + * sysdeps/unix/sysv/linux/check_pf.c (cache): Don't use + libc_freeres_ptr. + (freecache): New function to free CACHE on exit. + * sunrpc/xdr.c (xdr_string): Add comment about SIZE initialization. diff --git a/NEWS b/NEWS index f4c501ca568..3ef9162fbb9 100644 --- a/NEWS +++ b/NEWS @@ -21,7 +21,7 @@ Version 2.20 16882, 16885, 16888, 16890, 16912, 16915, 16916, 16917, 16918, 16922, 16927, 16928, 16932, 16943, 16958, 16965, 16966, 16967, 16977, 16978, 16984, 16990, 16996, 17009, 17022, 17031, 17042, 17048, 17050, 17058, - 17061, 17062, 17069, 17075, 17079, 17084, 17086, 17092, 17097. + 17061, 17062, 17069, 17075, 17079, 17084, 17086, 17092, 17097, 17125. * Optimized strchr implementation for AArch64. Contributed by ARM Ltd. diff --git a/sysdeps/unix/sysv/linux/check_pf.c b/sysdeps/unix/sysv/linux/check_pf.c index 1bc1def72f1..c7fd9b0376a 100644 --- a/sysdeps/unix/sysv/linux/check_pf.c +++ b/sysdeps/unix/sysv/linux/check_pf.c @@ -61,7 +61,7 @@ static struct cached_data noai6ai_cached = .in6ailen = 0 }; -libc_freeres_ptr (static struct cached_data *cache); +static struct cached_data *cache; __libc_lock_define_initialized (static, lock); @@ -401,6 +401,12 @@ __check_pf (bool *seen_ipv4, bool *seen_ipv6, *seen_ipv6 = true; } +/* Free the cache if it has been allocated. */ +libc_freeres_fn (freecache) +{ + if (cache) + __free_in6ai (cache->in6ai); +} void __free_in6ai (struct in6addrinfo *ai)