about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@redhat.com>2014-07-10 14:15:16 +0530
committerSiddhesh Poyarekar <siddhesh@redhat.com>2014-07-10 14:15:16 +0530
commitd62aa75af1941fca6f07e107afc447b7b248e340 (patch)
treea1864dfb0d666f1d9136fe644022e1c213ca60c5
parent7000d82e01dc04344eaa1772698c9b0c304a892f (diff)
downloadglibc-d62aa75af1941fca6f07e107afc447b7b248e340.tar.gz
glibc-d62aa75af1941fca6f07e107afc447b7b248e340.tar.xz
glibc-d62aa75af1941fca6f07e107afc447b7b248e340.zip
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.
-rw-r--r--ChangeLog5
-rw-r--r--NEWS2
-rw-r--r--sysdeps/unix/sysv/linux/check_pf.c8
3 files changed, 13 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index f5b5599486..72e9cf9e28 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2014-07-10  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
+	[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 f4c501ca56..3ef9162fbb 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 1bc1def72f..c7fd9b0376 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)