~ubuntu-branches/ubuntu/precise/eglibc/precise-security

« back to all changes in this revision

Viewing changes to debian/patches/any/CVE-2015-8776.diff

  • Committer: Package Import Robot
  • Author(s): Steve Beattie
  • Date: 2016-04-08 23:59:46 UTC
  • Revision ID: package-import@ubuntu.com-20160408235946-pvg6dc2pni64ycse
Tags: 2.15-0ubuntu10.14
* SECURITY UPDATE: buffer overflow in gethostbyname_r and related
  functions
  - debian/patches/any/CVE-2015-1781.diff: take alignment padding
    into account when computing if buffer is too small.
  - CVE-2015-1781
* SECURITY UPDATE: glibc Name Service Switch (NSS) denial of sevice
  - debian/patches/any/CVE-2014-8121-1.diff: do not close NSS files
    database during iteration.
  - debian/patches/any/CVE-2014-8121-2.diff: Separate internal state
    between getXXent and getXXbyYY NSS calls.
  - CVE-2014-8121
* SECURITY UPDATE: glibc unbounded stack usage in NaN strtod
  conversion
  - debian/patches/any/CVE-2014-9761-1.diff: Refactor strtod parsing
    of NaN payloads.
  - debian/patches/any/CVE-2014-9761-1.diff:  Fix nan functions
    handling of payload strings
  - CVE-2014-9761
* SECURITY UPDATE: out of range data to strftime() causes segfault
  (denial of service)
  - debian/patches/any/CVE-2015-8776.diff: add range checks to
    strftime() processing
  - CVE-2015-8776
* SECURITY UPDATE: glibc honors LD_POINTER_GUARD env for setuid
  AT_SECURE programs (e.g. setuid), allowing disabling of pointer
  mangling
  - debian/patches/any/CVE-2015-8777.diff: Always enable pointer
    guard
  - CVE-2015-8777
* SECURITY UPDATE: integer overflow in hcreate and hcreate_r
  - debian/patches/any/CVE-2015-8778.diff: check for large inputs
  - CVE-2015-8778
* SECURITY UPDATE: unbounded stack allocation in catopen()
  - debian/patches/any/CVE-2015-8779.diff: stop using unbounded
    alloca()
  - CVE-2015-8779
* SECURITY UPDATE: Stack overflow in _nss_dns_getnetbyname_r
  - debian/patches/any/CVE-2016-3075.diff: do not make unneeded
    memory copy on the stack.
  - CVE-2016-3075
* SECURITY UPDATE: pt_chown privilege escalation
  - debian/patches/any/CVE-2016-2856-pre.diff: add option to
    enable/disable pt_chown.
  - debian/patches/any/CVE-2016-2856.diff: grantpt: trust the kernel
    about pty group and permission mode
  - debian/debhelper.in/libc-bin.install: drop installation of
    pt_chown
  - CVE-2016-2856, CVE-2013-2207
* debian/debhelper.in/libc.postinst: add reboot notifications for
  security updates (LP: #1546457)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
From d36c75fc0d44deec29635dd239b0fbd206ca49b7 Mon Sep 17 00:00:00 2001
 
2
From: Paul Pluzhnikov <ppluzhnikov@google.com>
 
3
Date: Sat, 26 Sep 2015 13:27:48 -0700
 
4
Subject: [PATCH] Fix BZ #18985 -- out of range data to strftime() causes a segfault
 
5
 
 
6
        [BZ #18985]
 
7
        * time/strftime_l.c (a_wkday, f_wkday, a_month, f_month): Range check.
 
8
        (__strftime_internal): Likewise.
 
9
        * time/tst-strftime.c (do_bz18985): New test.
 
10
        (do_test): Call it.
 
11
 
 
12
[Note: patch differs from upstream commit in that the entries in
 
13
the Changelog and NEWS were dropped to avoid patch conflicts. -- sbeattie]
 
14
---
 
15
 time/strftime_l.c   |   20 +++++++++++++-------
 
16
 time/tst-strftime.c |   52 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 
17
 2 files changed, 64 insertions(+), 8 deletions(-)
 
18
 
 
19
Index: b/time/strftime_l.c
 
20
===================================================================
 
21
--- a/time/strftime_l.c
 
22
+++ b/time/strftime_l.c
 
23
@@ -513,13 +513,17 @@ __strftime_internal (s, maxsize, format,
 
24
      only a few elements.  Dereference the pointers only if the format
 
25
      requires this.  Then it is ok to fail if the pointers are invalid.  */
 
26
 # define a_wkday \
 
27
-  ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))
 
28
+  ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6                             \
 
29
+                    ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday)))
 
30
 # define f_wkday \
 
31
-  ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))
 
32
+  ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6                             \
 
33
+                    ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday)))
 
34
 # define a_month \
 
35
-  ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))
 
36
+  ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11                      \
 
37
+                    ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon)))
 
38
 # define f_month \
 
39
-  ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))
 
40
+  ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11                      \
 
41
+                    ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon)))
 
42
 # define ampm \
 
43
   ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11                   \
 
44
                                 ? NLW(PM_STR) : NLW(AM_STR)))
 
45
@@ -529,8 +533,10 @@ __strftime_internal (s, maxsize, format,
 
46
 # define ap_len STRLEN (ampm)
 
47
 #else
 
48
 # if !HAVE_STRFTIME
 
49
-#  define f_wkday (weekday_name[tp->tm_wday])
 
50
-#  define f_month (month_name[tp->tm_mon])
 
51
+#  define f_wkday (tp->tm_wday < 0 || tp->tm_wday > 6  \
 
52
+                  ? "?" : weekday_name[tp->tm_wday])
 
53
+#  define f_month (tp->tm_mon < 0 || tp->tm_mon > 11   \
 
54
+                  ? "?" : month_name[tp->tm_mon])
 
55
 #  define a_wkday f_wkday
 
56
 #  define a_month f_month
 
57
 #  define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11))
 
58
@@ -1324,7 +1330,7 @@ __strftime_internal (s, maxsize, format,
 
59
                  *tzset_called = true;
 
60
                }
 
61
 # endif
 
62
-             zone = tzname[tp->tm_isdst];
 
63
+             zone = tp->tm_isdst <= 1 ? tzname[tp->tm_isdst] : "?";
 
64
            }
 
65
 #endif
 
66
          if (! zone)
 
67
Index: b/time/tst-strftime.c
 
68
===================================================================
 
69
--- a/time/tst-strftime.c
 
70
+++ b/time/tst-strftime.c
 
71
@@ -4,6 +4,56 @@
 
72
 #include <time.h>
 
73
 
 
74
 
 
75
+static int
 
76
+do_bz18985 (void)
 
77
+{
 
78
+  char buf[1000];
 
79
+  struct tm ttm;
 
80
+  int rc, ret = 0;
 
81
+
 
82
+  memset (&ttm, 1, sizeof (ttm));
 
83
+  ttm.tm_zone = NULL;  /* Dereferenced directly if non-NULL.  */
 
84
+  rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm);
 
85
+
 
86
+  if (rc == 66)
 
87
+    {
 
88
+      const char expected[]
 
89
+       = "? ? ? ? ? ? 16843009 16843009:16843009:16843009 16844909 +467836 ?";
 
90
+      if (0 != strcmp (buf, expected))
 
91
+       {
 
92
+         printf ("expected:\n  %s\ngot:\n  %s\n", expected, buf);
 
93
+         ret += 1;
 
94
+       }
 
95
+    }
 
96
+  else
 
97
+    {
 
98
+      printf ("expected 66, got %d\n", rc);
 
99
+      ret += 1;
 
100
+    }
 
101
+
 
102
+  /* Check negative values as well.  */
 
103
+  memset (&ttm, 0xFF, sizeof (ttm));
 
104
+  ttm.tm_zone = NULL;  /* Dereferenced directly if non-NULL.  */
 
105
+  rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm);
 
106
+
 
107
+  if (rc == 30)
 
108
+    {
 
109
+      const char expected[] = "? ? ? ? ? ? -1 -1:-1:-1 1899  ";
 
110
+      if (0 != strcmp (buf, expected))
 
111
+       {
 
112
+         printf ("expected:\n  %s\ngot:\n  %s\n", expected, buf);
 
113
+         ret += 1;
 
114
+       }
 
115
+    }
 
116
+  else
 
117
+    {
 
118
+      printf ("expected 30, got %d\n", rc);
 
119
+      ret += 1;
 
120
+    }
 
121
+
 
122
+  return ret;
 
123
+}
 
124
+
 
125
 static struct
 
126
 {
 
127
   const char *fmt;
 
128
@@ -104,7 +154,7 @@ do_test (void)
 
129
        }
 
130
     }
 
131
 
 
132
-  return result;
 
133
+  return result + do_bz18985 ();
 
134
 }
 
135
 
 
136
 #define TEST_FUNCTION do_test ()