]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
CVE-2015-1781: resolv/nss_dns/dns-host.c buffer overflow [BZ#18287]
authorArjun Shankar <arjun.is@lostca.se>
Tue, 21 Apr 2015 12:06:31 +0000 (14:06 +0200)
committerTulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
Fri, 24 Apr 2015 20:03:13 +0000 (17:03 -0300)
Conflicts:
NEWS

ChangeLog
NEWS
resolv/nss_dns/dns-host.c

index f302131dc4394bd0fe0d2cbf95fea36118fdba14..f006275a24d9a47488a58b76c7e0fc0a9451f556 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-04-21  Arjun Shankar  <arjun.is@lostca.se>
+
+       [BZ #18287]
+       * resolv/nss_dns/dns-host.c (getanswer_r): Adjust buffer length
+       based on padding.  (CVE-2015-1781)
+
 2014-06-03  Andreas Schwab  <schwab@suse.de>
 
        [BZ #15946]
diff --git a/NEWS b/NEWS
index ecccd4b68d3c0d59a3096dc0cff1c45dfa6649f2..48bd9ede730f55b5ad4c62c9e0daeed46c19217e 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,7 +13,14 @@ Version 2.18.1
   15723, 15734, 15735, 15797, 15892, 15895, 15909, 15915, 15917, 15946,
   15996, 16072, 16150, 16169, 16387, 16414, 16430, 16431, 16510, 16617,
   16618, 16885, 16916, 16943, 16958, 17048, 17137, 17187, 17325, 17625,
-  17630, 18104.
+  17630, 18104, 18287.
+
+* A buffer overflow in gethostbyname_r and related functions performing DNS
+  requests has been fixed.  If the NSS functions were called with a
+  misaligned buffer, the buffer length change due to pointer alignment was
+  not taken into account.  This could result in application crashes or,
+  potentially arbitrary code execution, using crafted, but syntactically
+  valid DNS responses.  (CVE-2015-1781)
 
 * Support for powerpc64le has been added.
 
index 9018bb98a663b4eaa5c9bd9d63ffef340a304497..0c9d6dcc8b1107aaa325f5121082ee3fa71f5d00 100644 (file)
@@ -613,7 +613,8 @@ getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype,
   int have_to_map = 0;
   uintptr_t pad = -(uintptr_t) buffer % __alignof__ (struct host_data);
   buffer += pad;
-  if (__builtin_expect (buflen < sizeof (struct host_data) + pad, 0))
+  buflen = buflen > pad ? buflen - pad : 0;
+  if (__builtin_expect (buflen < sizeof (struct host_data), 0))
     {
       /* The buffer is too small.  */
     too_small: