diff options
Diffstat (limited to 'meta')
-rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2015-8776.patch | 155 | ||||
-rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2015-8777.patch | 123 | ||||
-rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2015-8779.patch | 262 | ||||
-rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch | 1039 | ||||
-rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch | 385 |
5 files changed, 0 insertions, 1964 deletions
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-8776.patch b/meta/recipes-core/glibc/glibc/CVE-2015-8776.patch deleted file mode 100644 index 684f344177..0000000000 --- a/meta/recipes-core/glibc/glibc/CVE-2015-8776.patch +++ /dev/null | |||
@@ -1,155 +0,0 @@ | |||
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 | ||
5 | segfault | ||
6 | |||
7 | Upstream-Status: Backport | ||
8 | CVE: CVE-2015-8776 | ||
9 | [Yocto # 8980] | ||
10 | |||
11 | https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=d36c75fc0d44deec29635dd239b0fbd206ca49b7 | ||
12 | |||
13 | Signed-off-by: Armin Kuster <akuster@mvista.com> | ||
14 | |||
15 | --- | ||
16 | ChangeLog | 8 ++++++++ | ||
17 | NEWS | 2 +- | ||
18 | time/strftime_l.c | 20 +++++++++++++------- | ||
19 | time/tst-strftime.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- | ||
20 | 4 files changed, 73 insertions(+), 9 deletions(-) | ||
21 | |||
22 | Index: git/ChangeLog | ||
23 | =================================================================== | ||
24 | --- git.orig/ChangeLog | ||
25 | +++ git/ChangeLog | ||
26 | @@ -1,3 +1,11 @@ | ||
27 | +2015-09-26 Paul Pluzhnikov <ppluzhnikov@google.com> | ||
28 | + | ||
29 | + [BZ #18985] | ||
30 | + * time/strftime_l.c (a_wkday, f_wkday, a_month, f_month): Range check. | ||
31 | + (__strftime_internal): Likewise. | ||
32 | + * time/tst-strftime.c (do_bz18985): New test. | ||
33 | + (do_test): Call it. | ||
34 | + | ||
35 | 2015-12-04 Joseph Myers <joseph@codesourcery.com> | ||
36 | |||
37 | [BZ #16961] | ||
38 | Index: git/time/strftime_l.c | ||
39 | =================================================================== | ||
40 | --- git.orig/time/strftime_l.c | ||
41 | +++ git/time/strftime_l.c | ||
42 | @@ -514,13 +514,17 @@ __strftime_internal (s, maxsize, format, | ||
43 | only a few elements. Dereference the pointers only if the format | ||
44 | requires this. Then it is ok to fail if the pointers are invalid. */ | ||
45 | # define a_wkday \ | ||
46 | - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday)) | ||
47 | + ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ | ||
48 | + ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))) | ||
49 | # define f_wkday \ | ||
50 | - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday)) | ||
51 | + ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \ | ||
52 | + ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))) | ||
53 | # define a_month \ | ||
54 | - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon)) | ||
55 | + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ | ||
56 | + ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))) | ||
57 | # define f_month \ | ||
58 | - ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon)) | ||
59 | + ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \ | ||
60 | + ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))) | ||
61 | # define ampm \ | ||
62 | ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \ | ||
63 | ? NLW(PM_STR) : NLW(AM_STR))) | ||
64 | @@ -530,8 +534,10 @@ __strftime_internal (s, maxsize, format, | ||
65 | # define ap_len STRLEN (ampm) | ||
66 | #else | ||
67 | # if !HAVE_STRFTIME | ||
68 | -# define f_wkday (weekday_name[tp->tm_wday]) | ||
69 | -# define f_month (month_name[tp->tm_mon]) | ||
70 | +# define f_wkday (tp->tm_wday < 0 || tp->tm_wday > 6 \ | ||
71 | + ? "?" : weekday_name[tp->tm_wday]) | ||
72 | +# define f_month (tp->tm_mon < 0 || tp->tm_mon > 11 \ | ||
73 | + ? "?" : month_name[tp->tm_mon]) | ||
74 | # define a_wkday f_wkday | ||
75 | # define a_month f_month | ||
76 | # define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11)) | ||
77 | @@ -1325,7 +1331,7 @@ __strftime_internal (s, maxsize, format, | ||
78 | *tzset_called = true; | ||
79 | } | ||
80 | # endif | ||
81 | - zone = tzname[tp->tm_isdst]; | ||
82 | + zone = tp->tm_isdst <= 1 ? tzname[tp->tm_isdst] : "?"; | ||
83 | } | ||
84 | #endif | ||
85 | if (! zone) | ||
86 | Index: git/time/tst-strftime.c | ||
87 | =================================================================== | ||
88 | --- git.orig/time/tst-strftime.c | ||
89 | +++ git/time/tst-strftime.c | ||
90 | @@ -4,6 +4,56 @@ | ||
91 | #include <time.h> | ||
92 | |||
93 | |||
94 | +static int | ||
95 | +do_bz18985 (void) | ||
96 | +{ | ||
97 | + char buf[1000]; | ||
98 | + struct tm ttm; | ||
99 | + int rc, ret = 0; | ||
100 | + | ||
101 | + memset (&ttm, 1, sizeof (ttm)); | ||
102 | + ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */ | ||
103 | + rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); | ||
104 | + | ||
105 | + if (rc == 66) | ||
106 | + { | ||
107 | + const char expected[] | ||
108 | + = "? ? ? ? ? ? 16843009 16843009:16843009:16843009 16844909 +467836 ?"; | ||
109 | + if (0 != strcmp (buf, expected)) | ||
110 | + { | ||
111 | + printf ("expected:\n %s\ngot:\n %s\n", expected, buf); | ||
112 | + ret += 1; | ||
113 | + } | ||
114 | + } | ||
115 | + else | ||
116 | + { | ||
117 | + printf ("expected 66, got %d\n", rc); | ||
118 | + ret += 1; | ||
119 | + } | ||
120 | + | ||
121 | + /* Check negative values as well. */ | ||
122 | + memset (&ttm, 0xFF, sizeof (ttm)); | ||
123 | + ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */ | ||
124 | + rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm); | ||
125 | + | ||
126 | + if (rc == 30) | ||
127 | + { | ||
128 | + const char expected[] = "? ? ? ? ? ? -1 -1:-1:-1 1899 "; | ||
129 | + if (0 != strcmp (buf, expected)) | ||
130 | + { | ||
131 | + printf ("expected:\n %s\ngot:\n %s\n", expected, buf); | ||
132 | + ret += 1; | ||
133 | + } | ||
134 | + } | ||
135 | + else | ||
136 | + { | ||
137 | + printf ("expected 30, got %d\n", rc); | ||
138 | + ret += 1; | ||
139 | + } | ||
140 | + | ||
141 | + return ret; | ||
142 | +} | ||
143 | + | ||
144 | static struct | ||
145 | { | ||
146 | const char *fmt; | ||
147 | @@ -104,7 +154,7 @@ do_test (void) | ||
148 | } | ||
149 | } | ||
150 | |||
151 | - return result; | ||
152 | + return result + do_bz18985 (); | ||
153 | } | ||
154 | |||
155 | #define TEST_FUNCTION do_test () | ||
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-8777.patch b/meta/recipes-core/glibc/glibc/CVE-2015-8777.patch deleted file mode 100644 index eeab72d650..0000000000 --- a/meta/recipes-core/glibc/glibc/CVE-2015-8777.patch +++ /dev/null | |||
@@ -1,123 +0,0 @@ | |||
1 | From a014cecd82b71b70a6a843e250e06b541ad524f7 Mon Sep 17 00:00:00 2001 | ||
2 | From: Florian Weimer <fweimer@redhat.com> | ||
3 | Date: Thu, 15 Oct 2015 09:23:07 +0200 | ||
4 | Subject: [PATCH] Always enable pointer guard [BZ #18928] | ||
5 | |||
6 | Honoring the LD_POINTER_GUARD environment variable in AT_SECURE mode | ||
7 | has security implications. This commit enables pointer guard | ||
8 | unconditionally, and the environment variable is now ignored. | ||
9 | |||
10 | [BZ #18928] | ||
11 | * sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Remove | ||
12 | _dl_pointer_guard member. | ||
13 | * elf/rtld.c (_rtld_global_ro): Remove _dl_pointer_guard | ||
14 | initializer. | ||
15 | (security_init): Always set up pointer guard. | ||
16 | (process_envvars): Do not process LD_POINTER_GUARD. | ||
17 | |||
18 | Upstream-Status: Backport | ||
19 | CVE: CVE-2015-8777 | ||
20 | [Yocto # 8980] | ||
21 | |||
22 | https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commit;h=a014cecd82b71b70a6a843e250e06b541ad524f7 | ||
23 | |||
24 | Signed-off-by: Armin Kuster <akuster@mvista.com> | ||
25 | |||
26 | --- | ||
27 | ChangeLog | 10 ++++++++++ | ||
28 | NEWS | 13 ++++++++----- | ||
29 | elf/rtld.c | 15 ++++----------- | ||
30 | sysdeps/generic/ldsodefs.h | 3 --- | ||
31 | 4 files changed, 22 insertions(+), 19 deletions(-) | ||
32 | |||
33 | Index: git/ChangeLog | ||
34 | =================================================================== | ||
35 | --- git.orig/ChangeLog | ||
36 | +++ git/ChangeLog | ||
37 | @@ -1,3 +1,14 @@ | ||
38 | +2015-10-15 Florian Weimer <fweimer@redhat.com> | ||
39 | + | ||
40 | + [BZ #18928] | ||
41 | + * sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Remove | ||
42 | + _dl_pointer_guard member. | ||
43 | + * elf/rtld.c (_rtld_global_ro): Remove _dl_pointer_guard | ||
44 | + initializer. | ||
45 | + (security_init): Always set up pointer guard. | ||
46 | + (process_envvars): Do not process LD_POINTER_GUARD. | ||
47 | + | ||
48 | + | ||
49 | 2015-08-10 Maxim Ostapenko <m.ostapenko@partner.samsung.com> | ||
50 | |||
51 | [BZ #18778] | ||
52 | Index: git/NEWS | ||
53 | =================================================================== | ||
54 | --- git.orig/NEWS | ||
55 | +++ git/NEWS | ||
56 | @@ -34,7 +34,10 @@ Version 2.22 | ||
57 | 18533, 18534, 18536, 18539, 18540, 18542, 18544, 18545, 18546, 18547, | ||
58 | 18549, 18553, 18557, 18558, 18569, 18583, 18585, 18586, 18592, 18593, | ||
59 | 18594, 18602, 18612, 18613, 18619, 18633, 18635, 18641, 18643, 18648, | ||
60 | - 18657, 18676, 18694, 18696. | ||
61 | + 18657, 18676, 18694, 18696, 18928. | ||
62 | + | ||
63 | +* The LD_POINTER_GUARD environment variable can no longer be used to | ||
64 | + disable the pointer guard feature. It is always enabled. | ||
65 | |||
66 | * Cache information can be queried via sysconf() function on s390 e.g. with | ||
67 | _SC_LEVEL1_ICACHE_SIZE as argument. | ||
68 | Index: git/elf/rtld.c | ||
69 | =================================================================== | ||
70 | --- git.orig/elf/rtld.c | ||
71 | +++ git/elf/rtld.c | ||
72 | @@ -163,7 +163,6 @@ struct rtld_global_ro _rtld_global_ro at | ||
73 | ._dl_hwcap_mask = HWCAP_IMPORTANT, | ||
74 | ._dl_lazy = 1, | ||
75 | ._dl_fpu_control = _FPU_DEFAULT, | ||
76 | - ._dl_pointer_guard = 1, | ||
77 | ._dl_pagesize = EXEC_PAGESIZE, | ||
78 | ._dl_inhibit_cache = 0, | ||
79 | |||
80 | @@ -710,15 +709,12 @@ security_init (void) | ||
81 | #endif | ||
82 | |||
83 | /* Set up the pointer guard as well, if necessary. */ | ||
84 | - if (GLRO(dl_pointer_guard)) | ||
85 | - { | ||
86 | - uintptr_t pointer_chk_guard = _dl_setup_pointer_guard (_dl_random, | ||
87 | - stack_chk_guard); | ||
88 | + uintptr_t pointer_chk_guard | ||
89 | + = _dl_setup_pointer_guard (_dl_random, stack_chk_guard); | ||
90 | #ifdef THREAD_SET_POINTER_GUARD | ||
91 | - THREAD_SET_POINTER_GUARD (pointer_chk_guard); | ||
92 | + THREAD_SET_POINTER_GUARD (pointer_chk_guard); | ||
93 | #endif | ||
94 | - __pointer_chk_guard_local = pointer_chk_guard; | ||
95 | - } | ||
96 | + __pointer_chk_guard_local = pointer_chk_guard; | ||
97 | |||
98 | /* We do not need the _dl_random value anymore. The less | ||
99 | information we leave behind, the better, so clear the | ||
100 | @@ -2478,9 +2474,6 @@ process_envvars (enum mode *modep) | ||
101 | GLRO(dl_use_load_bias) = envline[14] == '1' ? -1 : 0; | ||
102 | break; | ||
103 | } | ||
104 | - | ||
105 | - if (memcmp (envline, "POINTER_GUARD", 13) == 0) | ||
106 | - GLRO(dl_pointer_guard) = envline[14] != '0'; | ||
107 | break; | ||
108 | |||
109 | case 14: | ||
110 | Index: git/sysdeps/generic/ldsodefs.h | ||
111 | =================================================================== | ||
112 | --- git.orig/sysdeps/generic/ldsodefs.h | ||
113 | +++ git/sysdeps/generic/ldsodefs.h | ||
114 | @@ -600,9 +600,6 @@ struct rtld_global_ro | ||
115 | /* List of auditing interfaces. */ | ||
116 | struct audit_ifaces *_dl_audit; | ||
117 | unsigned int _dl_naudit; | ||
118 | - | ||
119 | - /* 0 if internal pointer values should not be guarded, 1 if they should. */ | ||
120 | - EXTERN int _dl_pointer_guard; | ||
121 | }; | ||
122 | # define __rtld_global_attribute__ | ||
123 | # if IS_IN (rtld) | ||
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-8779.patch b/meta/recipes-core/glibc/glibc/CVE-2015-8779.patch deleted file mode 100644 index 4dc93c769d..0000000000 --- a/meta/recipes-core/glibc/glibc/CVE-2015-8779.patch +++ /dev/null | |||
@@ -1,262 +0,0 @@ | |||
1 | From 0f58539030e436449f79189b6edab17d7479796e Mon Sep 17 00:00:00 2001 | ||
2 | From: Paul Pluzhnikov <ppluzhnikov@google.com> | ||
3 | Date: Sat, 8 Aug 2015 15:53:03 -0700 | ||
4 | Subject: [PATCH] Fix BZ #17905 | ||
5 | |||
6 | Upstream-Status: Backport | ||
7 | CVE: CVE-2015-8779 | ||
8 | [Yocto # 8980] | ||
9 | |||
10 | https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=0f58539030e436449f79189b6edab17d7479796e | ||
11 | |||
12 | Signed-off-by: Armin Kuster <akuster@mvista.com> | ||
13 | |||
14 | --- | ||
15 | ChangeLog | 8 ++++++++ | ||
16 | NEWS | 2 +- | ||
17 | catgets/Makefile | 9 ++++++++- | ||
18 | catgets/catgets.c | 19 ++++++++++++------- | ||
19 | catgets/open_catalog.c | 23 ++++++++++++++--------- | ||
20 | catgets/tst-catgets.c | 31 +++++++++++++++++++++++++++++++ | ||
21 | 6 files changed, 74 insertions(+), 18 deletions(-) | ||
22 | |||
23 | Index: git/catgets/Makefile | ||
24 | =================================================================== | ||
25 | --- git.orig/catgets/Makefile | ||
26 | +++ git/catgets/Makefile | ||
27 | @@ -37,6 +37,7 @@ ifeq (y,$(OPTION_EGLIBC_CATGETS)) | ||
28 | ifeq ($(run-built-tests),yes) | ||
29 | tests-special += $(objpfx)de/libc.cat $(objpfx)test1.cat $(objpfx)test2.cat \ | ||
30 | $(objpfx)sample.SJIS.cat $(objpfx)test-gencat.out | ||
31 | +tests-special += $(objpfx)tst-catgets-mem.out | ||
32 | endif | ||
33 | endif | ||
34 | gencat-modules = xmalloc | ||
35 | @@ -53,9 +54,11 @@ catgets-CPPFLAGS := -DNLSPATH='"$(msgcat | ||
36 | |||
37 | generated += de.msg test1.cat test1.h test2.cat test2.h sample.SJIS.cat \ | ||
38 | test-gencat.h | ||
39 | +generated += tst-catgets.mtrace tst-catgets-mem.out | ||
40 | + | ||
41 | generated-dirs += de | ||
42 | |||
43 | -tst-catgets-ENV = NLSPATH="$(objpfx)%l/%N.cat" LANG=de | ||
44 | +tst-catgets-ENV = NLSPATH="$(objpfx)%l/%N.cat" LANG=de MALLOC_TRACE=$(objpfx)tst-catgets.mtrace | ||
45 | |||
46 | ifeq ($(run-built-tests),yes) | ||
47 | # This test just checks whether the program produces any error or not. | ||
48 | @@ -89,4 +92,8 @@ $(objpfx)test-gencat.out: test-gencat.sh | ||
49 | $(objpfx)sample.SJIS.cat: sample.SJIS $(objpfx)gencat | ||
50 | $(built-program-cmd) -H $(objpfx)test-gencat.h < $(word 1,$^) > $@; \ | ||
51 | $(evaluate-test) | ||
52 | + | ||
53 | +$(objpfx)tst-catgets-mem.out: $(objpfx)tst-catgets.out | ||
54 | + $(common-objpfx)malloc/mtrace $(objpfx)tst-catgets.mtrace > $@; \ | ||
55 | + $(evaluate-test) | ||
56 | endif | ||
57 | Index: git/catgets/catgets.c | ||
58 | =================================================================== | ||
59 | --- git.orig/catgets/catgets.c | ||
60 | +++ git/catgets/catgets.c | ||
61 | @@ -16,7 +16,6 @@ | ||
62 | License along with the GNU C Library; if not, see | ||
63 | <http://www.gnu.org/licenses/>. */ | ||
64 | |||
65 | -#include <alloca.h> | ||
66 | #include <errno.h> | ||
67 | #include <locale.h> | ||
68 | #include <nl_types.h> | ||
69 | @@ -35,6 +34,7 @@ catopen (const char *cat_name, int flag) | ||
70 | __nl_catd result; | ||
71 | const char *env_var = NULL; | ||
72 | const char *nlspath = NULL; | ||
73 | + char *tmp = NULL; | ||
74 | |||
75 | if (strchr (cat_name, '/') == NULL) | ||
76 | { | ||
77 | @@ -54,7 +54,10 @@ catopen (const char *cat_name, int flag) | ||
78 | { | ||
79 | /* Append the system dependent directory. */ | ||
80 | size_t len = strlen (nlspath) + 1 + sizeof NLSPATH; | ||
81 | - char *tmp = alloca (len); | ||
82 | + tmp = malloc (len); | ||
83 | + | ||
84 | + if (__glibc_unlikely (tmp == NULL)) | ||
85 | + return (nl_catd) -1; | ||
86 | |||
87 | __stpcpy (__stpcpy (__stpcpy (tmp, nlspath), ":"), NLSPATH); | ||
88 | nlspath = tmp; | ||
89 | @@ -65,16 +68,18 @@ catopen (const char *cat_name, int flag) | ||
90 | |||
91 | result = (__nl_catd) malloc (sizeof (*result)); | ||
92 | if (result == NULL) | ||
93 | - /* We cannot get enough memory. */ | ||
94 | - return (nl_catd) -1; | ||
95 | - | ||
96 | - if (__open_catalog (cat_name, nlspath, env_var, result) != 0) | ||
97 | + { | ||
98 | + /* We cannot get enough memory. */ | ||
99 | + result = (nl_catd) -1; | ||
100 | + } | ||
101 | + else if (__open_catalog (cat_name, nlspath, env_var, result) != 0) | ||
102 | { | ||
103 | /* Couldn't open the file. */ | ||
104 | free ((void *) result); | ||
105 | - return (nl_catd) -1; | ||
106 | + result = (nl_catd) -1; | ||
107 | } | ||
108 | |||
109 | + free (tmp); | ||
110 | return (nl_catd) result; | ||
111 | } | ||
112 | |||
113 | Index: git/catgets/open_catalog.c | ||
114 | =================================================================== | ||
115 | --- git.orig/catgets/open_catalog.c | ||
116 | +++ git/catgets/open_catalog.c | ||
117 | @@ -47,6 +47,7 @@ __open_catalog (const char *cat_name, co | ||
118 | size_t tab_size; | ||
119 | const char *lastp; | ||
120 | int result = -1; | ||
121 | + char *buf = NULL; | ||
122 | |||
123 | if (strchr (cat_name, '/') != NULL || nlspath == NULL) | ||
124 | fd = open_not_cancel_2 (cat_name, O_RDONLY); | ||
125 | @@ -57,23 +58,23 @@ __open_catalog (const char *cat_name, co | ||
126 | if (__glibc_unlikely (bufact + (n) >= bufmax)) \ | ||
127 | { \ | ||
128 | char *old_buf = buf; \ | ||
129 | - bufmax += 256 + (n); \ | ||
130 | - buf = (char *) alloca (bufmax); \ | ||
131 | - memcpy (buf, old_buf, bufact); \ | ||
132 | + bufmax += (bufmax < 256 + (n)) ? 256 + (n) : bufmax; \ | ||
133 | + buf = realloc (buf, bufmax); \ | ||
134 | + if (__glibc_unlikely (buf == NULL)) \ | ||
135 | + { \ | ||
136 | + free (old_buf); \ | ||
137 | + return -1; \ | ||
138 | + } \ | ||
139 | } | ||
140 | |||
141 | /* The RUN_NLSPATH variable contains a colon separated list of | ||
142 | descriptions where we expect to find catalogs. We have to | ||
143 | recognize certain % substitutions and stop when we found the | ||
144 | first existing file. */ | ||
145 | - char *buf; | ||
146 | size_t bufact; | ||
147 | - size_t bufmax; | ||
148 | + size_t bufmax = 0; | ||
149 | size_t len; | ||
150 | |||
151 | - buf = NULL; | ||
152 | - bufmax = 0; | ||
153 | - | ||
154 | fd = -1; | ||
155 | while (*run_nlspath != '\0') | ||
156 | { | ||
157 | @@ -188,7 +189,10 @@ __open_catalog (const char *cat_name, co | ||
158 | |||
159 | /* Avoid dealing with directories and block devices */ | ||
160 | if (__builtin_expect (fd, 0) < 0) | ||
161 | - return -1; | ||
162 | + { | ||
163 | + free (buf); | ||
164 | + return -1; | ||
165 | + } | ||
166 | |||
167 | if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) < 0) | ||
168 | goto close_unlock_return; | ||
169 | @@ -325,6 +329,7 @@ __open_catalog (const char *cat_name, co | ||
170 | /* Release the lock again. */ | ||
171 | close_unlock_return: | ||
172 | close_not_cancel_no_status (fd); | ||
173 | + free (buf); | ||
174 | |||
175 | return result; | ||
176 | } | ||
177 | Index: git/catgets/tst-catgets.c | ||
178 | =================================================================== | ||
179 | --- git.orig/catgets/tst-catgets.c | ||
180 | +++ git/catgets/tst-catgets.c | ||
181 | @@ -1,7 +1,10 @@ | ||
182 | +#include <assert.h> | ||
183 | #include <mcheck.h> | ||
184 | #include <nl_types.h> | ||
185 | #include <stdio.h> | ||
186 | +#include <stdlib.h> | ||
187 | #include <string.h> | ||
188 | +#include <sys/resource.h> | ||
189 | |||
190 | |||
191 | static const char *msgs[] = | ||
192 | @@ -12,6 +15,33 @@ static const char *msgs[] = | ||
193 | }; | ||
194 | #define nmsgs (sizeof (msgs) / sizeof (msgs[0])) | ||
195 | |||
196 | + | ||
197 | +/* Test for unbounded alloca. */ | ||
198 | +static int | ||
199 | +do_bz17905 (void) | ||
200 | +{ | ||
201 | + char *buf; | ||
202 | + struct rlimit rl; | ||
203 | + nl_catd result; | ||
204 | + | ||
205 | + const int sz = 1024 * 1024; | ||
206 | + | ||
207 | + getrlimit (RLIMIT_STACK, &rl); | ||
208 | + rl.rlim_cur = sz; | ||
209 | + setrlimit (RLIMIT_STACK, &rl); | ||
210 | + | ||
211 | + buf = malloc (sz + 1); | ||
212 | + memset (buf, 'A', sz); | ||
213 | + buf[sz] = '\0'; | ||
214 | + setenv ("NLSPATH", buf, 1); | ||
215 | + | ||
216 | + result = catopen (buf, NL_CAT_LOCALE); | ||
217 | + assert (result == (nl_catd) -1); | ||
218 | + | ||
219 | + free (buf); | ||
220 | + return 0; | ||
221 | +} | ||
222 | + | ||
223 | #define ROUNDS 5 | ||
224 | |||
225 | static int | ||
226 | @@ -62,6 +92,7 @@ do_test (void) | ||
227 | } | ||
228 | } | ||
229 | |||
230 | + result += do_bz17905 (); | ||
231 | return result; | ||
232 | } | ||
233 | |||
234 | Index: git/ChangeLog | ||
235 | =================================================================== | ||
236 | --- git.orig/ChangeLog | ||
237 | +++ git/ChangeLog | ||
238 | @@ -1,3 +1,11 @@ | ||
239 | +2015-08-08 Paul Pluzhnikov <ppluzhnikov@google.com> | ||
240 | + | ||
241 | + [BZ #17905] | ||
242 | + * catgets/Makefile (tst-catgets-mem): New test. | ||
243 | + * catgets/catgets.c (catopen): Don't use unbounded alloca. | ||
244 | + * catgets/open_catalog.c (__open_catalog): Likewise. | ||
245 | + * catgets/tst-catgets.c (do_bz17905): Test unbounded alloca. | ||
246 | + | ||
247 | 2015-10-15 Florian Weimer <fweimer@redhat.com> | ||
248 | |||
249 | [BZ #18928] | ||
250 | Index: git/NEWS | ||
251 | =================================================================== | ||
252 | --- git.orig/NEWS | ||
253 | +++ git/NEWS | ||
254 | @@ -9,7 +9,7 @@ Version 2.22.1 | ||
255 | |||
256 | * The following bugs are resolved with this release: | ||
257 | |||
258 | - 18778, 18781, 18787. | ||
259 | + 18778, 18781, 18787, 17905. | ||
260 | |||
261 | Version 2.22 | ||
262 | |||
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch b/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch deleted file mode 100644 index 3aca913317..0000000000 --- a/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch +++ /dev/null | |||
@@ -1,1039 +0,0 @@ | |||
1 | From e02cabecf0d025ec4f4ddee290bdf7aadb873bb3 Mon Sep 17 00:00:00 2001 | ||
2 | From: Joseph Myers <joseph@codesourcery.com> | ||
3 | Date: Tue, 24 Nov 2015 22:24:52 +0000 | ||
4 | Subject: [PATCH] Refactor strtod parsing of NaN payloads. | ||
5 | |||
6 | The nan* functions handle their string argument by constructing a | ||
7 | NAN(...) string on the stack as a VLA and passing it to strtod | ||
8 | functions. | ||
9 | |||
10 | This approach has problems discussed in bug 16961 and bug 16962: the | ||
11 | stack usage is unbounded, and it gives incorrect results in certain | ||
12 | cases where the argument is not a valid n-char-sequence. | ||
13 | |||
14 | The natural fix for both issues is to refactor the NaN payload parsing | ||
15 | out of strtod into a separate function that the nan* functions can | ||
16 | call directly, so that no temporary string needs constructing on the | ||
17 | stack at all. This patch does that refactoring in preparation for | ||
18 | fixing those bugs (but without actually using the new functions from | ||
19 | nan* - which will also require exporting them from libc at version | ||
20 | GLIBC_PRIVATE). This patch is not intended to change any user-visible | ||
21 | behavior, so no tests are added (fixes for the above bugs will of | ||
22 | course add tests for them). | ||
23 | |||
24 | This patch builds on my recent fixes for strtol and strtod issues in | ||
25 | Turkish locales. Given those fixes, the parsing of NaN payloads is | ||
26 | locale-independent; thus, the new functions do not need to take a | ||
27 | locale_t argument. | ||
28 | |||
29 | Tested for x86_64, x86, mips64 and powerpc. | ||
30 | |||
31 | * stdlib/strtod_nan.c: New file. | ||
32 | * stdlib/strtod_nan_double.h: Likewise. | ||
33 | * stdlib/strtod_nan_float.h: Likewise. | ||
34 | * stdlib/strtod_nan_main.c: Likewise. | ||
35 | * stdlib/strtod_nan_narrow.h: Likewise. | ||
36 | * stdlib/strtod_nan_wide.h: Likewise. | ||
37 | * stdlib/strtof_nan.c: Likewise. | ||
38 | * stdlib/strtold_nan.c: Likewise. | ||
39 | * sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h: Likewise. | ||
40 | * sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h: Likewise. | ||
41 | * sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h: Likewise. | ||
42 | * wcsmbs/wcstod_nan.c: Likewise. | ||
43 | * wcsmbs/wcstof_nan.c: Likewise. | ||
44 | * wcsmbs/wcstold_nan.c: Likewise. | ||
45 | * stdlib/Makefile (routines): Add strtof_nan, strtod_nan and | ||
46 | strtold_nan. | ||
47 | * wcsmbs/Makefile (routines): Add wcstod_nan, wcstold_nan and | ||
48 | wcstof_nan. | ||
49 | * include/stdlib.h (__strtof_nan): Declare and use | ||
50 | libc_hidden_proto. | ||
51 | (__strtod_nan): Likewise. | ||
52 | (__strtold_nan): Likewise. | ||
53 | (__wcstof_nan): Likewise. | ||
54 | (__wcstod_nan): Likewise. | ||
55 | (__wcstold_nan): Likewise. | ||
56 | * include/wchar.h (____wcstoull_l_internal): Declare. | ||
57 | * stdlib/strtod_l.c: Do not include <ieee754.h>. | ||
58 | (____strtoull_l_internal): Remove declaration. | ||
59 | (STRTOF_NAN): Define macro. | ||
60 | (SET_MANTISSA): Remove macro. | ||
61 | (STRTOULL): Likewise. | ||
62 | (____STRTOF_INTERNAL): Use STRTOF_NAN to parse NaN payload. | ||
63 | * stdlib/strtof_l.c (____strtoull_l_internal): Remove declaration. | ||
64 | (STRTOF_NAN): Define macro. | ||
65 | (SET_MANTISSA): Remove macro. | ||
66 | * sysdeps/ieee754/ldbl-128/strtold_l.c (STRTOF_NAN): Define macro. | ||
67 | (SET_MANTISSA): Remove macro. | ||
68 | * sysdeps/ieee754/ldbl-128ibm/strtold_l.c (STRTOF_NAN): Define | ||
69 | macro. | ||
70 | (SET_MANTISSA): Remove macro. | ||
71 | * sysdeps/ieee754/ldbl-64-128/strtold_l.c (STRTOF_NAN): Define | ||
72 | macro. | ||
73 | (SET_MANTISSA): Remove macro. | ||
74 | * sysdeps/ieee754/ldbl-96/strtold_l.c (STRTOF_NAN): Define macro. | ||
75 | (SET_MANTISSA): Remove macro. | ||
76 | * wcsmbs/wcstod_l.c (____wcstoull_l_internal): Remove declaration. | ||
77 | * wcsmbs/wcstof_l.c (____wcstoull_l_internal): Likewise. | ||
78 | * wcsmbs/wcstold_l.c (____wcstoull_l_internal): Likewise. | ||
79 | |||
80 | Upstream-Status: Backport | ||
81 | CVE: CVE-2015-9761 patch #1 | ||
82 | [Yocto # 8980] | ||
83 | |||
84 | https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=e02cabecf0d025ec4f4ddee290bdf7aadb873bb3 | ||
85 | |||
86 | Signed-off-by: Armin Kuster <akuster@mvista.com> | ||
87 | |||
88 | --- | ||
89 | ChangeLog | 49 ++++++++++++++++++ | ||
90 | include/stdlib.h | 18 +++++++ | ||
91 | include/wchar.h | 3 ++ | ||
92 | stdlib/Makefile | 1 + | ||
93 | stdlib/strtod_l.c | 48 ++++-------------- | ||
94 | stdlib/strtod_nan.c | 24 +++++++++ | ||
95 | stdlib/strtod_nan_double.h | 30 +++++++++++ | ||
96 | stdlib/strtod_nan_float.h | 29 +++++++++++ | ||
97 | stdlib/strtod_nan_main.c | 63 ++++++++++++++++++++++++ | ||
98 | stdlib/strtod_nan_narrow.h | 22 +++++++++ | ||
99 | stdlib/strtod_nan_wide.h | 22 +++++++++ | ||
100 | stdlib/strtof_l.c | 11 +---- | ||
101 | stdlib/strtof_nan.c | 24 +++++++++ | ||
102 | stdlib/strtold_nan.c | 30 +++++++++++ | ||
103 | sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h | 33 +++++++++++++ | ||
104 | sysdeps/ieee754/ldbl-128/strtold_l.c | 13 +---- | ||
105 | sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h | 30 +++++++++++ | ||
106 | sysdeps/ieee754/ldbl-128ibm/strtold_l.c | 10 +--- | ||
107 | sysdeps/ieee754/ldbl-64-128/strtold_l.c | 13 +---- | ||
108 | sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h | 30 +++++++++++ | ||
109 | sysdeps/ieee754/ldbl-96/strtold_l.c | 10 +--- | ||
110 | wcsmbs/Makefile | 1 + | ||
111 | wcsmbs/wcstod_l.c | 3 -- | ||
112 | wcsmbs/wcstod_nan.c | 23 +++++++++ | ||
113 | wcsmbs/wcstof_l.c | 3 -- | ||
114 | wcsmbs/wcstof_nan.c | 23 +++++++++ | ||
115 | wcsmbs/wcstold_l.c | 3 -- | ||
116 | wcsmbs/wcstold_nan.c | 30 +++++++++++ | ||
117 | 28 files changed, 504 insertions(+), 95 deletions(-) | ||
118 | create mode 100644 stdlib/strtod_nan.c | ||
119 | create mode 100644 stdlib/strtod_nan_double.h | ||
120 | create mode 100644 stdlib/strtod_nan_float.h | ||
121 | create mode 100644 stdlib/strtod_nan_main.c | ||
122 | create mode 100644 stdlib/strtod_nan_narrow.h | ||
123 | create mode 100644 stdlib/strtod_nan_wide.h | ||
124 | create mode 100644 stdlib/strtof_nan.c | ||
125 | create mode 100644 stdlib/strtold_nan.c | ||
126 | create mode 100644 sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h | ||
127 | create mode 100644 sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h | ||
128 | create mode 100644 sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h | ||
129 | create mode 100644 wcsmbs/wcstod_nan.c | ||
130 | create mode 100644 wcsmbs/wcstof_nan.c | ||
131 | create mode 100644 wcsmbs/wcstold_nan.c | ||
132 | |||
133 | Index: git/include/stdlib.h | ||
134 | =================================================================== | ||
135 | --- git.orig/include/stdlib.h | ||
136 | +++ git/include/stdlib.h | ||
137 | @@ -203,6 +203,24 @@ libc_hidden_proto (strtoll) | ||
138 | libc_hidden_proto (strtoul) | ||
139 | libc_hidden_proto (strtoull) | ||
140 | |||
141 | +extern float __strtof_nan (const char *, char **, char) internal_function; | ||
142 | +extern double __strtod_nan (const char *, char **, char) internal_function; | ||
143 | +extern long double __strtold_nan (const char *, char **, char) | ||
144 | + internal_function; | ||
145 | +extern float __wcstof_nan (const wchar_t *, wchar_t **, wchar_t) | ||
146 | + internal_function; | ||
147 | +extern double __wcstod_nan (const wchar_t *, wchar_t **, wchar_t) | ||
148 | + internal_function; | ||
149 | +extern long double __wcstold_nan (const wchar_t *, wchar_t **, wchar_t) | ||
150 | + internal_function; | ||
151 | + | ||
152 | +libc_hidden_proto (__strtof_nan) | ||
153 | +libc_hidden_proto (__strtod_nan) | ||
154 | +libc_hidden_proto (__strtold_nan) | ||
155 | +libc_hidden_proto (__wcstof_nan) | ||
156 | +libc_hidden_proto (__wcstod_nan) | ||
157 | +libc_hidden_proto (__wcstold_nan) | ||
158 | + | ||
159 | extern char *__ecvt (double __value, int __ndigit, int *__restrict __decpt, | ||
160 | int *__restrict __sign); | ||
161 | extern char *__fcvt (double __value, int __ndigit, int *__restrict __decpt, | ||
162 | Index: git/include/wchar.h | ||
163 | =================================================================== | ||
164 | --- git.orig/include/wchar.h | ||
165 | +++ git/include/wchar.h | ||
166 | @@ -52,6 +52,9 @@ extern unsigned long long int __wcstoull | ||
167 | __restrict __endptr, | ||
168 | int __base, | ||
169 | int __group) __THROW; | ||
170 | +extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, | ||
171 | + wchar_t **, int, int, | ||
172 | + __locale_t); | ||
173 | libc_hidden_proto (__wcstof_internal) | ||
174 | libc_hidden_proto (__wcstod_internal) | ||
175 | libc_hidden_proto (__wcstold_internal) | ||
176 | Index: git/stdlib/Makefile | ||
177 | =================================================================== | ||
178 | --- git.orig/stdlib/Makefile | ||
179 | +++ git/stdlib/Makefile | ||
180 | @@ -51,6 +51,7 @@ routines-y := \ | ||
181 | strtol_l strtoul_l strtoll_l strtoull_l \ | ||
182 | strtof strtod strtold \ | ||
183 | strtof_l strtod_l strtold_l \ | ||
184 | + strtof_nan strtod_nan strtold_nan \ | ||
185 | system canonicalize \ | ||
186 | a64l l64a \ | ||
187 | getsubopt xpg_basename \ | ||
188 | Index: git/stdlib/strtod_l.c | ||
189 | =================================================================== | ||
190 | --- git.orig/stdlib/strtod_l.c | ||
191 | +++ git/stdlib/strtod_l.c | ||
192 | @@ -21,8 +21,6 @@ | ||
193 | #include <xlocale.h> | ||
194 | |||
195 | extern double ____strtod_l_internal (const char *, char **, int, __locale_t); | ||
196 | -extern unsigned long long int ____strtoull_l_internal (const char *, char **, | ||
197 | - int, int, __locale_t); | ||
198 | |||
199 | /* Configuration part. These macros are defined by `strtold.c', | ||
200 | `strtof.c', `wcstod.c', `wcstold.c', and `wcstof.c' to produce the | ||
201 | @@ -34,27 +32,20 @@ extern unsigned long long int ____strtou | ||
202 | # ifdef USE_WIDE_CHAR | ||
203 | # define STRTOF wcstod_l | ||
204 | # define __STRTOF __wcstod_l | ||
205 | +# define STRTOF_NAN __wcstod_nan | ||
206 | # else | ||
207 | # define STRTOF strtod_l | ||
208 | # define __STRTOF __strtod_l | ||
209 | +# define STRTOF_NAN __strtod_nan | ||
210 | # endif | ||
211 | # define MPN2FLOAT __mpn_construct_double | ||
212 | # define FLOAT_HUGE_VAL HUGE_VAL | ||
213 | -# define SET_MANTISSA(flt, mant) \ | ||
214 | - do { union ieee754_double u; \ | ||
215 | - u.d = (flt); \ | ||
216 | - u.ieee_nan.mantissa0 = (mant) >> 32; \ | ||
217 | - u.ieee_nan.mantissa1 = (mant); \ | ||
218 | - if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ | ||
219 | - (flt) = u.d; \ | ||
220 | - } while (0) | ||
221 | #endif | ||
222 | /* End of configuration part. */ | ||
223 | |||
224 | #include <ctype.h> | ||
225 | #include <errno.h> | ||
226 | #include <float.h> | ||
227 | -#include <ieee754.h> | ||
228 | #include "../locale/localeinfo.h" | ||
229 | #include <locale.h> | ||
230 | #include <math.h> | ||
231 | @@ -105,7 +96,6 @@ extern unsigned long long int ____strtou | ||
232 | # define TOLOWER_C(Ch) __towlower_l ((Ch), _nl_C_locobj_ptr) | ||
233 | # define STRNCASECMP(S1, S2, N) \ | ||
234 | __wcsncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr) | ||
235 | -# define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, loc) | ||
236 | #else | ||
237 | # define STRING_TYPE char | ||
238 | # define CHAR_TYPE char | ||
239 | @@ -117,7 +107,6 @@ extern unsigned long long int ____strtou | ||
240 | # define TOLOWER_C(Ch) __tolower_l ((Ch), _nl_C_locobj_ptr) | ||
241 | # define STRNCASECMP(S1, S2, N) \ | ||
242 | __strncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr) | ||
243 | -# define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, loc) | ||
244 | #endif | ||
245 | |||
246 | |||
247 | @@ -668,33 +657,14 @@ ____STRTOF_INTERNAL (nptr, endptr, group | ||
248 | if (*cp == L_('(')) | ||
249 | { | ||
250 | const STRING_TYPE *startp = cp; | ||
251 | - do | ||
252 | - ++cp; | ||
253 | - while ((*cp >= L_('0') && *cp <= L_('9')) | ||
254 | - || ({ CHAR_TYPE lo = TOLOWER (*cp); | ||
255 | - lo >= L_('a') && lo <= L_('z'); }) | ||
256 | - || *cp == L_('_')); | ||
257 | - | ||
258 | - if (*cp != L_(')')) | ||
259 | - /* The closing brace is missing. Only match the NAN | ||
260 | - part. */ | ||
261 | - cp = startp; | ||
262 | + STRING_TYPE *endp; | ||
263 | + retval = STRTOF_NAN (cp + 1, &endp, L_(')')); | ||
264 | + if (*endp == L_(')')) | ||
265 | + /* Consume the closing parenthesis. */ | ||
266 | + cp = endp + 1; | ||
267 | else | ||
268 | - { | ||
269 | - /* This is a system-dependent way to specify the | ||
270 | - bitmask used for the NaN. We expect it to be | ||
271 | - a number which is put in the mantissa of the | ||
272 | - number. */ | ||
273 | - STRING_TYPE *endp; | ||
274 | - unsigned long long int mant; | ||
275 | - | ||
276 | - mant = STRTOULL (startp + 1, &endp, 0); | ||
277 | - if (endp == cp) | ||
278 | - SET_MANTISSA (retval, mant); | ||
279 | - | ||
280 | - /* Consume the closing brace. */ | ||
281 | - ++cp; | ||
282 | - } | ||
283 | + /* Only match the NAN part. */ | ||
284 | + cp = startp; | ||
285 | } | ||
286 | |||
287 | if (endptr != NULL) | ||
288 | Index: git/stdlib/strtod_nan.c | ||
289 | =================================================================== | ||
290 | --- /dev/null | ||
291 | +++ git/stdlib/strtod_nan.c | ||
292 | @@ -0,0 +1,24 @@ | ||
293 | +/* Convert string for NaN payload to corresponding NaN. Narrow | ||
294 | + strings, double. | ||
295 | + Copyright (C) 2015 Free Software Foundation, Inc. | ||
296 | + This file is part of the GNU C Library. | ||
297 | + | ||
298 | + The GNU C Library is free software; you can redistribute it and/or | ||
299 | + modify it under the terms of the GNU Lesser General Public | ||
300 | + License as published by the Free Software Foundation; either | ||
301 | + version 2.1 of the License, or (at your option) any later version. | ||
302 | + | ||
303 | + The GNU C Library is distributed in the hope that it will be useful, | ||
304 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
305 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
306 | + Lesser General Public License for more details. | ||
307 | + | ||
308 | + You should have received a copy of the GNU Lesser General Public | ||
309 | + License along with the GNU C Library; if not, see | ||
310 | + <http://www.gnu.org/licenses/>. */ | ||
311 | + | ||
312 | +#include <strtod_nan_narrow.h> | ||
313 | +#include <strtod_nan_double.h> | ||
314 | + | ||
315 | +#define STRTOD_NAN __strtod_nan | ||
316 | +#include <strtod_nan_main.c> | ||
317 | Index: git/stdlib/strtod_nan_double.h | ||
318 | =================================================================== | ||
319 | --- /dev/null | ||
320 | +++ git/stdlib/strtod_nan_double.h | ||
321 | @@ -0,0 +1,30 @@ | ||
322 | +/* Convert string for NaN payload to corresponding NaN. For double. | ||
323 | + Copyright (C) 1997-2015 Free Software Foundation, Inc. | ||
324 | + This file is part of the GNU C Library. | ||
325 | + | ||
326 | + The GNU C Library is free software; you can redistribute it and/or | ||
327 | + modify it under the terms of the GNU Lesser General Public | ||
328 | + License as published by the Free Software Foundation; either | ||
329 | + version 2.1 of the License, or (at your option) any later version. | ||
330 | + | ||
331 | + The GNU C Library is distributed in the hope that it will be useful, | ||
332 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
333 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
334 | + Lesser General Public License for more details. | ||
335 | + | ||
336 | + You should have received a copy of the GNU Lesser General Public | ||
337 | + License along with the GNU C Library; if not, see | ||
338 | + <http://www.gnu.org/licenses/>. */ | ||
339 | + | ||
340 | +#define FLOAT double | ||
341 | +#define SET_MANTISSA(flt, mant) \ | ||
342 | + do \ | ||
343 | + { \ | ||
344 | + union ieee754_double u; \ | ||
345 | + u.d = (flt); \ | ||
346 | + u.ieee_nan.mantissa0 = (mant) >> 32; \ | ||
347 | + u.ieee_nan.mantissa1 = (mant); \ | ||
348 | + if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ | ||
349 | + (flt) = u.d; \ | ||
350 | + } \ | ||
351 | + while (0) | ||
352 | Index: git/stdlib/strtod_nan_float.h | ||
353 | =================================================================== | ||
354 | --- /dev/null | ||
355 | +++ git/stdlib/strtod_nan_float.h | ||
356 | @@ -0,0 +1,29 @@ | ||
357 | +/* Convert string for NaN payload to corresponding NaN. For float. | ||
358 | + Copyright (C) 1997-2015 Free Software Foundation, Inc. | ||
359 | + This file is part of the GNU C Library. | ||
360 | + | ||
361 | + The GNU C Library is free software; you can redistribute it and/or | ||
362 | + modify it under the terms of the GNU Lesser General Public | ||
363 | + License as published by the Free Software Foundation; either | ||
364 | + version 2.1 of the License, or (at your option) any later version. | ||
365 | + | ||
366 | + The GNU C Library is distributed in the hope that it will be useful, | ||
367 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
368 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
369 | + Lesser General Public License for more details. | ||
370 | + | ||
371 | + You should have received a copy of the GNU Lesser General Public | ||
372 | + License along with the GNU C Library; if not, see | ||
373 | + <http://www.gnu.org/licenses/>. */ | ||
374 | + | ||
375 | +#define FLOAT float | ||
376 | +#define SET_MANTISSA(flt, mant) \ | ||
377 | + do \ | ||
378 | + { \ | ||
379 | + union ieee754_float u; \ | ||
380 | + u.f = (flt); \ | ||
381 | + u.ieee_nan.mantissa = (mant); \ | ||
382 | + if (u.ieee.mantissa != 0) \ | ||
383 | + (flt) = u.f; \ | ||
384 | + } \ | ||
385 | + while (0) | ||
386 | Index: git/stdlib/strtod_nan_main.c | ||
387 | =================================================================== | ||
388 | --- /dev/null | ||
389 | +++ git/stdlib/strtod_nan_main.c | ||
390 | @@ -0,0 +1,63 @@ | ||
391 | +/* Convert string for NaN payload to corresponding NaN. | ||
392 | + Copyright (C) 1997-2015 Free Software Foundation, Inc. | ||
393 | + This file is part of the GNU C Library. | ||
394 | + | ||
395 | + The GNU C Library is free software; you can redistribute it and/or | ||
396 | + modify it under the terms of the GNU Lesser General Public | ||
397 | + License as published by the Free Software Foundation; either | ||
398 | + version 2.1 of the License, or (at your option) any later version. | ||
399 | + | ||
400 | + The GNU C Library is distributed in the hope that it will be useful, | ||
401 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
402 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
403 | + Lesser General Public License for more details. | ||
404 | + | ||
405 | + You should have received a copy of the GNU Lesser General Public | ||
406 | + License along with the GNU C Library; if not, see | ||
407 | + <http://www.gnu.org/licenses/>. */ | ||
408 | + | ||
409 | +#include <ieee754.h> | ||
410 | +#include <locale.h> | ||
411 | +#include <math.h> | ||
412 | +#include <stdlib.h> | ||
413 | +#include <wchar.h> | ||
414 | + | ||
415 | + | ||
416 | +/* If STR starts with an optional n-char-sequence as defined by ISO C | ||
417 | + (a sequence of ASCII letters, digits and underscores), followed by | ||
418 | + ENDC, return a NaN whose payload is set based on STR. Otherwise, | ||
419 | + return a default NAN. If ENDPTR is not NULL, set *ENDPTR to point | ||
420 | + to the character after the initial n-char-sequence. */ | ||
421 | + | ||
422 | +internal_function | ||
423 | +FLOAT | ||
424 | +STRTOD_NAN (const STRING_TYPE *str, STRING_TYPE **endptr, STRING_TYPE endc) | ||
425 | +{ | ||
426 | + const STRING_TYPE *cp = str; | ||
427 | + | ||
428 | + while ((*cp >= L_('0') && *cp <= L_('9')) | ||
429 | + || (*cp >= L_('A') && *cp <= L_('Z')) | ||
430 | + || (*cp >= L_('a') && *cp <= L_('z')) | ||
431 | + || *cp == L_('_')) | ||
432 | + ++cp; | ||
433 | + | ||
434 | + FLOAT retval = NAN; | ||
435 | + if (*cp != endc) | ||
436 | + goto out; | ||
437 | + | ||
438 | + /* This is a system-dependent way to specify the bitmask used for | ||
439 | + the NaN. We expect it to be a number which is put in the | ||
440 | + mantissa of the number. */ | ||
441 | + STRING_TYPE *endp; | ||
442 | + unsigned long long int mant; | ||
443 | + | ||
444 | + mant = STRTOULL (str, &endp, 0); | ||
445 | + if (endp == cp) | ||
446 | + SET_MANTISSA (retval, mant); | ||
447 | + | ||
448 | + out: | ||
449 | + if (endptr != NULL) | ||
450 | + *endptr = (STRING_TYPE *) cp; | ||
451 | + return retval; | ||
452 | +} | ||
453 | +libc_hidden_def (STRTOD_NAN) | ||
454 | Index: git/stdlib/strtod_nan_narrow.h | ||
455 | =================================================================== | ||
456 | --- /dev/null | ||
457 | +++ git/stdlib/strtod_nan_narrow.h | ||
458 | @@ -0,0 +1,22 @@ | ||
459 | +/* Convert string for NaN payload to corresponding NaN. Narrow strings. | ||
460 | + Copyright (C) 1997-2015 Free Software Foundation, Inc. | ||
461 | + This file is part of the GNU C Library. | ||
462 | + | ||
463 | + The GNU C Library is free software; you can redistribute it and/or | ||
464 | + modify it under the terms of the GNU Lesser General Public | ||
465 | + License as published by the Free Software Foundation; either | ||
466 | + version 2.1 of the License, or (at your option) any later version. | ||
467 | + | ||
468 | + The GNU C Library is distributed in the hope that it will be useful, | ||
469 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
470 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
471 | + Lesser General Public License for more details. | ||
472 | + | ||
473 | + You should have received a copy of the GNU Lesser General Public | ||
474 | + License along with the GNU C Library; if not, see | ||
475 | + <http://www.gnu.org/licenses/>. */ | ||
476 | + | ||
477 | +#define STRING_TYPE char | ||
478 | +#define L_(Ch) Ch | ||
479 | +#define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, \ | ||
480 | + _nl_C_locobj_ptr) | ||
481 | Index: git/stdlib/strtod_nan_wide.h | ||
482 | =================================================================== | ||
483 | --- /dev/null | ||
484 | +++ git/stdlib/strtod_nan_wide.h | ||
485 | @@ -0,0 +1,22 @@ | ||
486 | +/* Convert string for NaN payload to corresponding NaN. Wide strings. | ||
487 | + Copyright (C) 1997-2015 Free Software Foundation, Inc. | ||
488 | + This file is part of the GNU C Library. | ||
489 | + | ||
490 | + The GNU C Library is free software; you can redistribute it and/or | ||
491 | + modify it under the terms of the GNU Lesser General Public | ||
492 | + License as published by the Free Software Foundation; either | ||
493 | + version 2.1 of the License, or (at your option) any later version. | ||
494 | + | ||
495 | + The GNU C Library is distributed in the hope that it will be useful, | ||
496 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
497 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
498 | + Lesser General Public License for more details. | ||
499 | + | ||
500 | + You should have received a copy of the GNU Lesser General Public | ||
501 | + License along with the GNU C Library; if not, see | ||
502 | + <http://www.gnu.org/licenses/>. */ | ||
503 | + | ||
504 | +#define STRING_TYPE wchar_t | ||
505 | +#define L_(Ch) L##Ch | ||
506 | +#define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, \ | ||
507 | + _nl_C_locobj_ptr) | ||
508 | Index: git/stdlib/strtof_l.c | ||
509 | =================================================================== | ||
510 | --- git.orig/stdlib/strtof_l.c | ||
511 | +++ git/stdlib/strtof_l.c | ||
512 | @@ -20,26 +20,19 @@ | ||
513 | #include <xlocale.h> | ||
514 | |||
515 | extern float ____strtof_l_internal (const char *, char **, int, __locale_t); | ||
516 | -extern unsigned long long int ____strtoull_l_internal (const char *, char **, | ||
517 | - int, int, __locale_t); | ||
518 | |||
519 | #define FLOAT float | ||
520 | #define FLT FLT | ||
521 | #ifdef USE_WIDE_CHAR | ||
522 | # define STRTOF wcstof_l | ||
523 | # define __STRTOF __wcstof_l | ||
524 | +# define STRTOF_NAN __wcstof_nan | ||
525 | #else | ||
526 | # define STRTOF strtof_l | ||
527 | # define __STRTOF __strtof_l | ||
528 | +# define STRTOF_NAN __strtof_nan | ||
529 | #endif | ||
530 | #define MPN2FLOAT __mpn_construct_float | ||
531 | #define FLOAT_HUGE_VAL HUGE_VALF | ||
532 | -#define SET_MANTISSA(flt, mant) \ | ||
533 | - do { union ieee754_float u; \ | ||
534 | - u.f = (flt); \ | ||
535 | - u.ieee_nan.mantissa = (mant); \ | ||
536 | - if (u.ieee.mantissa != 0) \ | ||
537 | - (flt) = u.f; \ | ||
538 | - } while (0) | ||
539 | |||
540 | #include "strtod_l.c" | ||
541 | Index: git/stdlib/strtof_nan.c | ||
542 | =================================================================== | ||
543 | --- /dev/null | ||
544 | +++ git/stdlib/strtof_nan.c | ||
545 | @@ -0,0 +1,24 @@ | ||
546 | +/* Convert string for NaN payload to corresponding NaN. Narrow | ||
547 | + strings, float. | ||
548 | + Copyright (C) 2015 Free Software Foundation, Inc. | ||
549 | + This file is part of the GNU C Library. | ||
550 | + | ||
551 | + The GNU C Library is free software; you can redistribute it and/or | ||
552 | + modify it under the terms of the GNU Lesser General Public | ||
553 | + License as published by the Free Software Foundation; either | ||
554 | + version 2.1 of the License, or (at your option) any later version. | ||
555 | + | ||
556 | + The GNU C Library is distributed in the hope that it will be useful, | ||
557 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
558 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
559 | + Lesser General Public License for more details. | ||
560 | + | ||
561 | + You should have received a copy of the GNU Lesser General Public | ||
562 | + License along with the GNU C Library; if not, see | ||
563 | + <http://www.gnu.org/licenses/>. */ | ||
564 | + | ||
565 | +#include <strtod_nan_narrow.h> | ||
566 | +#include <strtod_nan_float.h> | ||
567 | + | ||
568 | +#define STRTOD_NAN __strtof_nan | ||
569 | +#include <strtod_nan_main.c> | ||
570 | Index: git/stdlib/strtold_nan.c | ||
571 | =================================================================== | ||
572 | --- /dev/null | ||
573 | +++ git/stdlib/strtold_nan.c | ||
574 | @@ -0,0 +1,30 @@ | ||
575 | +/* Convert string for NaN payload to corresponding NaN. Narrow | ||
576 | + strings, long double. | ||
577 | + Copyright (C) 2015 Free Software Foundation, Inc. | ||
578 | + This file is part of the GNU C Library. | ||
579 | + | ||
580 | + The GNU C Library is free software; you can redistribute it and/or | ||
581 | + modify it under the terms of the GNU Lesser General Public | ||
582 | + License as published by the Free Software Foundation; either | ||
583 | + version 2.1 of the License, or (at your option) any later version. | ||
584 | + | ||
585 | + The GNU C Library is distributed in the hope that it will be useful, | ||
586 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
587 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
588 | + Lesser General Public License for more details. | ||
589 | + | ||
590 | + You should have received a copy of the GNU Lesser General Public | ||
591 | + License along with the GNU C Library; if not, see | ||
592 | + <http://www.gnu.org/licenses/>. */ | ||
593 | + | ||
594 | +#include <math.h> | ||
595 | + | ||
596 | +/* This function is unused if long double and double have the same | ||
597 | + representation. */ | ||
598 | +#ifndef __NO_LONG_DOUBLE_MATH | ||
599 | +# include <strtod_nan_narrow.h> | ||
600 | +# include <strtod_nan_ldouble.h> | ||
601 | + | ||
602 | +# define STRTOD_NAN __strtold_nan | ||
603 | +# include <strtod_nan_main.c> | ||
604 | +#endif | ||
605 | Index: git/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h | ||
606 | =================================================================== | ||
607 | --- /dev/null | ||
608 | +++ git/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h | ||
609 | @@ -0,0 +1,33 @@ | ||
610 | +/* Convert string for NaN payload to corresponding NaN. For ldbl-128. | ||
611 | + Copyright (C) 1997-2015 Free Software Foundation, Inc. | ||
612 | + This file is part of the GNU C Library. | ||
613 | + | ||
614 | + The GNU C Library is free software; you can redistribute it and/or | ||
615 | + modify it under the terms of the GNU Lesser General Public | ||
616 | + License as published by the Free Software Foundation; either | ||
617 | + version 2.1 of the License, or (at your option) any later version. | ||
618 | + | ||
619 | + The GNU C Library is distributed in the hope that it will be useful, | ||
620 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
621 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
622 | + Lesser General Public License for more details. | ||
623 | + | ||
624 | + You should have received a copy of the GNU Lesser General Public | ||
625 | + License along with the GNU C Library; if not, see | ||
626 | + <http://www.gnu.org/licenses/>. */ | ||
627 | + | ||
628 | +#define FLOAT long double | ||
629 | +#define SET_MANTISSA(flt, mant) \ | ||
630 | + do \ | ||
631 | + { \ | ||
632 | + union ieee854_long_double u; \ | ||
633 | + u.d = (flt); \ | ||
634 | + u.ieee_nan.mantissa0 = 0; \ | ||
635 | + u.ieee_nan.mantissa1 = 0; \ | ||
636 | + u.ieee_nan.mantissa2 = (mant) >> 32; \ | ||
637 | + u.ieee_nan.mantissa3 = (mant); \ | ||
638 | + if ((u.ieee.mantissa0 | u.ieee.mantissa1 \ | ||
639 | + | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \ | ||
640 | + (flt) = u.d; \ | ||
641 | + } \ | ||
642 | + while (0) | ||
643 | Index: git/sysdeps/ieee754/ldbl-128/strtold_l.c | ||
644 | =================================================================== | ||
645 | --- git.orig/sysdeps/ieee754/ldbl-128/strtold_l.c | ||
646 | +++ git/sysdeps/ieee754/ldbl-128/strtold_l.c | ||
647 | @@ -25,22 +25,13 @@ | ||
648 | #ifdef USE_WIDE_CHAR | ||
649 | # define STRTOF wcstold_l | ||
650 | # define __STRTOF __wcstold_l | ||
651 | +# define STRTOF_NAN __wcstold_nan | ||
652 | #else | ||
653 | # define STRTOF strtold_l | ||
654 | # define __STRTOF __strtold_l | ||
655 | +# define STRTOF_NAN __strtold_nan | ||
656 | #endif | ||
657 | #define MPN2FLOAT __mpn_construct_long_double | ||
658 | #define FLOAT_HUGE_VAL HUGE_VALL | ||
659 | -#define SET_MANTISSA(flt, mant) \ | ||
660 | - do { union ieee854_long_double u; \ | ||
661 | - u.d = (flt); \ | ||
662 | - u.ieee_nan.mantissa0 = 0; \ | ||
663 | - u.ieee_nan.mantissa1 = 0; \ | ||
664 | - u.ieee_nan.mantissa2 = (mant) >> 32; \ | ||
665 | - u.ieee_nan.mantissa3 = (mant); \ | ||
666 | - if ((u.ieee.mantissa0 | u.ieee.mantissa1 \ | ||
667 | - | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \ | ||
668 | - (flt) = u.d; \ | ||
669 | - } while (0) | ||
670 | |||
671 | #include <strtod_l.c> | ||
672 | Index: git/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h | ||
673 | =================================================================== | ||
674 | --- /dev/null | ||
675 | +++ git/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h | ||
676 | @@ -0,0 +1,30 @@ | ||
677 | +/* Convert string for NaN payload to corresponding NaN. For ldbl-128ibm. | ||
678 | + Copyright (C) 1997-2015 Free Software Foundation, Inc. | ||
679 | + This file is part of the GNU C Library. | ||
680 | + | ||
681 | + The GNU C Library is free software; you can redistribute it and/or | ||
682 | + modify it under the terms of the GNU Lesser General Public | ||
683 | + License as published by the Free Software Foundation; either | ||
684 | + version 2.1 of the License, or (at your option) any later version. | ||
685 | + | ||
686 | + The GNU C Library is distributed in the hope that it will be useful, | ||
687 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
688 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
689 | + Lesser General Public License for more details. | ||
690 | + | ||
691 | + You should have received a copy of the GNU Lesser General Public | ||
692 | + License along with the GNU C Library; if not, see | ||
693 | + <http://www.gnu.org/licenses/>. */ | ||
694 | + | ||
695 | +#define FLOAT long double | ||
696 | +#define SET_MANTISSA(flt, mant) \ | ||
697 | + do \ | ||
698 | + { \ | ||
699 | + union ibm_extended_long_double u; \ | ||
700 | + u.ld = (flt); \ | ||
701 | + u.d[0].ieee_nan.mantissa0 = (mant) >> 32; \ | ||
702 | + u.d[0].ieee_nan.mantissa1 = (mant); \ | ||
703 | + if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0) \ | ||
704 | + (flt) = u.ld; \ | ||
705 | + } \ | ||
706 | + while (0) | ||
707 | Index: git/sysdeps/ieee754/ldbl-128ibm/strtold_l.c | ||
708 | =================================================================== | ||
709 | --- git.orig/sysdeps/ieee754/ldbl-128ibm/strtold_l.c | ||
710 | +++ git/sysdeps/ieee754/ldbl-128ibm/strtold_l.c | ||
711 | @@ -30,25 +30,19 @@ extern long double ____new_wcstold_l (co | ||
712 | # define STRTOF __new_wcstold_l | ||
713 | # define __STRTOF ____new_wcstold_l | ||
714 | # define ____STRTOF_INTERNAL ____wcstold_l_internal | ||
715 | +# define STRTOF_NAN __wcstold_nan | ||
716 | #else | ||
717 | extern long double ____new_strtold_l (const char *, char **, __locale_t); | ||
718 | # define STRTOF __new_strtold_l | ||
719 | # define __STRTOF ____new_strtold_l | ||
720 | # define ____STRTOF_INTERNAL ____strtold_l_internal | ||
721 | +# define STRTOF_NAN __strtold_nan | ||
722 | #endif | ||
723 | extern __typeof (__STRTOF) STRTOF; | ||
724 | libc_hidden_proto (__STRTOF) | ||
725 | libc_hidden_proto (STRTOF) | ||
726 | #define MPN2FLOAT __mpn_construct_long_double | ||
727 | #define FLOAT_HUGE_VAL HUGE_VALL | ||
728 | -# define SET_MANTISSA(flt, mant) \ | ||
729 | - do { union ibm_extended_long_double u; \ | ||
730 | - u.ld = (flt); \ | ||
731 | - u.d[0].ieee_nan.mantissa0 = (mant) >> 32; \ | ||
732 | - u.d[0].ieee_nan.mantissa1 = (mant); \ | ||
733 | - if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0) \ | ||
734 | - (flt) = u.ld; \ | ||
735 | - } while (0) | ||
736 | |||
737 | #include <strtod_l.c> | ||
738 | |||
739 | Index: git/sysdeps/ieee754/ldbl-64-128/strtold_l.c | ||
740 | =================================================================== | ||
741 | --- git.orig/sysdeps/ieee754/ldbl-64-128/strtold_l.c | ||
742 | +++ git/sysdeps/ieee754/ldbl-64-128/strtold_l.c | ||
743 | @@ -30,28 +30,19 @@ extern long double ____new_wcstold_l (co | ||
744 | # define STRTOF __new_wcstold_l | ||
745 | # define __STRTOF ____new_wcstold_l | ||
746 | # define ____STRTOF_INTERNAL ____wcstold_l_internal | ||
747 | +# define STRTOF_NAN __wcstold_nan | ||
748 | #else | ||
749 | extern long double ____new_strtold_l (const char *, char **, __locale_t); | ||
750 | # define STRTOF __new_strtold_l | ||
751 | # define __STRTOF ____new_strtold_l | ||
752 | # define ____STRTOF_INTERNAL ____strtold_l_internal | ||
753 | +# define STRTOF_NAN __strtold_nan | ||
754 | #endif | ||
755 | extern __typeof (__STRTOF) STRTOF; | ||
756 | libc_hidden_proto (__STRTOF) | ||
757 | libc_hidden_proto (STRTOF) | ||
758 | #define MPN2FLOAT __mpn_construct_long_double | ||
759 | #define FLOAT_HUGE_VAL HUGE_VALL | ||
760 | -#define SET_MANTISSA(flt, mant) \ | ||
761 | - do { union ieee854_long_double u; \ | ||
762 | - u.d = (flt); \ | ||
763 | - u.ieee_nan.mantissa0 = 0; \ | ||
764 | - u.ieee_nan.mantissa1 = 0; \ | ||
765 | - u.ieee_nan.mantissa2 = (mant) >> 32; \ | ||
766 | - u.ieee_nan.mantissa3 = (mant); \ | ||
767 | - if ((u.ieee.mantissa0 | u.ieee.mantissa1 \ | ||
768 | - | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \ | ||
769 | - (flt) = u.d; \ | ||
770 | - } while (0) | ||
771 | |||
772 | #include <strtod_l.c> | ||
773 | |||
774 | Index: git/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h | ||
775 | =================================================================== | ||
776 | --- /dev/null | ||
777 | +++ git/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h | ||
778 | @@ -0,0 +1,30 @@ | ||
779 | +/* Convert string for NaN payload to corresponding NaN. For ldbl-96. | ||
780 | + Copyright (C) 1997-2015 Free Software Foundation, Inc. | ||
781 | + This file is part of the GNU C Library. | ||
782 | + | ||
783 | + The GNU C Library is free software; you can redistribute it and/or | ||
784 | + modify it under the terms of the GNU Lesser General Public | ||
785 | + License as published by the Free Software Foundation; either | ||
786 | + version 2.1 of the License, or (at your option) any later version. | ||
787 | + | ||
788 | + The GNU C Library is distributed in the hope that it will be useful, | ||
789 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
790 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
791 | + Lesser General Public License for more details. | ||
792 | + | ||
793 | + You should have received a copy of the GNU Lesser General Public | ||
794 | + License along with the GNU C Library; if not, see | ||
795 | + <http://www.gnu.org/licenses/>. */ | ||
796 | + | ||
797 | +#define FLOAT long double | ||
798 | +#define SET_MANTISSA(flt, mant) \ | ||
799 | + do \ | ||
800 | + { \ | ||
801 | + union ieee854_long_double u; \ | ||
802 | + u.d = (flt); \ | ||
803 | + u.ieee_nan.mantissa0 = (mant) >> 32; \ | ||
804 | + u.ieee_nan.mantissa1 = (mant); \ | ||
805 | + if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ | ||
806 | + (flt) = u.d; \ | ||
807 | + } \ | ||
808 | + while (0) | ||
809 | Index: git/sysdeps/ieee754/ldbl-96/strtold_l.c | ||
810 | =================================================================== | ||
811 | --- git.orig/sysdeps/ieee754/ldbl-96/strtold_l.c | ||
812 | +++ git/sysdeps/ieee754/ldbl-96/strtold_l.c | ||
813 | @@ -25,19 +25,13 @@ | ||
814 | #ifdef USE_WIDE_CHAR | ||
815 | # define STRTOF wcstold_l | ||
816 | # define __STRTOF __wcstold_l | ||
817 | +# define STRTOF_NAN __wcstold_nan | ||
818 | #else | ||
819 | # define STRTOF strtold_l | ||
820 | # define __STRTOF __strtold_l | ||
821 | +# define STRTOF_NAN __strtold_nan | ||
822 | #endif | ||
823 | #define MPN2FLOAT __mpn_construct_long_double | ||
824 | #define FLOAT_HUGE_VAL HUGE_VALL | ||
825 | -#define SET_MANTISSA(flt, mant) \ | ||
826 | - do { union ieee854_long_double u; \ | ||
827 | - u.d = (flt); \ | ||
828 | - u.ieee_nan.mantissa0 = (mant) >> 32; \ | ||
829 | - u.ieee_nan.mantissa1 = (mant); \ | ||
830 | - if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ | ||
831 | - (flt) = u.d; \ | ||
832 | - } while (0) | ||
833 | |||
834 | #include <stdlib/strtod_l.c> | ||
835 | Index: git/wcsmbs/Makefile | ||
836 | =================================================================== | ||
837 | --- git.orig/wcsmbs/Makefile | ||
838 | +++ git/wcsmbs/Makefile | ||
839 | @@ -39,6 +39,7 @@ routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR | ||
840 | wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \ | ||
841 | wcstol_l wcstoul_l wcstoll_l wcstoull_l \ | ||
842 | wcstod_l wcstold_l wcstof_l \ | ||
843 | + wcstod_nan wcstold_nan wcstof_nan \ | ||
844 | wcscoll wcsxfrm \ | ||
845 | wcwidth wcswidth \ | ||
846 | wcscoll_l wcsxfrm_l \ | ||
847 | Index: git/wcsmbs/wcstod_l.c | ||
848 | =================================================================== | ||
849 | --- git.orig/wcsmbs/wcstod_l.c | ||
850 | +++ git/wcsmbs/wcstod_l.c | ||
851 | @@ -23,9 +23,6 @@ | ||
852 | |||
853 | extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int, | ||
854 | __locale_t); | ||
855 | -extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, | ||
856 | - wchar_t **, int, int, | ||
857 | - __locale_t); | ||
858 | |||
859 | #define USE_WIDE_CHAR 1 | ||
860 | |||
861 | Index: git/wcsmbs/wcstod_nan.c | ||
862 | =================================================================== | ||
863 | --- /dev/null | ||
864 | +++ git/wcsmbs/wcstod_nan.c | ||
865 | @@ -0,0 +1,23 @@ | ||
866 | +/* Convert string for NaN payload to corresponding NaN. Wide strings, double. | ||
867 | + Copyright (C) 2015 Free Software Foundation, Inc. | ||
868 | + This file is part of the GNU C Library. | ||
869 | + | ||
870 | + The GNU C Library is free software; you can redistribute it and/or | ||
871 | + modify it under the terms of the GNU Lesser General Public | ||
872 | + License as published by the Free Software Foundation; either | ||
873 | + version 2.1 of the License, or (at your option) any later version. | ||
874 | + | ||
875 | + The GNU C Library is distributed in the hope that it will be useful, | ||
876 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
877 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
878 | + Lesser General Public License for more details. | ||
879 | + | ||
880 | + You should have received a copy of the GNU Lesser General Public | ||
881 | + License along with the GNU C Library; if not, see | ||
882 | + <http://www.gnu.org/licenses/>. */ | ||
883 | + | ||
884 | +#include "../stdlib/strtod_nan_wide.h" | ||
885 | +#include "../stdlib/strtod_nan_double.h" | ||
886 | + | ||
887 | +#define STRTOD_NAN __wcstod_nan | ||
888 | +#include "../stdlib/strtod_nan_main.c" | ||
889 | Index: git/wcsmbs/wcstof_l.c | ||
890 | =================================================================== | ||
891 | --- git.orig/wcsmbs/wcstof_l.c | ||
892 | +++ git/wcsmbs/wcstof_l.c | ||
893 | @@ -25,8 +25,5 @@ | ||
894 | |||
895 | extern float ____wcstof_l_internal (const wchar_t *, wchar_t **, int, | ||
896 | __locale_t); | ||
897 | -extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, | ||
898 | - wchar_t **, int, int, | ||
899 | - __locale_t); | ||
900 | |||
901 | #include <stdlib/strtof_l.c> | ||
902 | Index: git/wcsmbs/wcstof_nan.c | ||
903 | =================================================================== | ||
904 | --- /dev/null | ||
905 | +++ git/wcsmbs/wcstof_nan.c | ||
906 | @@ -0,0 +1,23 @@ | ||
907 | +/* Convert string for NaN payload to corresponding NaN. Wide strings, float. | ||
908 | + Copyright (C) 2015 Free Software Foundation, Inc. | ||
909 | + This file is part of the GNU C Library. | ||
910 | + | ||
911 | + The GNU C Library is free software; you can redistribute it and/or | ||
912 | + modify it under the terms of the GNU Lesser General Public | ||
913 | + License as published by the Free Software Foundation; either | ||
914 | + version 2.1 of the License, or (at your option) any later version. | ||
915 | + | ||
916 | + The GNU C Library is distributed in the hope that it will be useful, | ||
917 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
918 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
919 | + Lesser General Public License for more details. | ||
920 | + | ||
921 | + You should have received a copy of the GNU Lesser General Public | ||
922 | + License along with the GNU C Library; if not, see | ||
923 | + <http://www.gnu.org/licenses/>. */ | ||
924 | + | ||
925 | +#include "../stdlib/strtod_nan_wide.h" | ||
926 | +#include "../stdlib/strtod_nan_float.h" | ||
927 | + | ||
928 | +#define STRTOD_NAN __wcstof_nan | ||
929 | +#include "../stdlib/strtod_nan_main.c" | ||
930 | Index: git/wcsmbs/wcstold_l.c | ||
931 | =================================================================== | ||
932 | --- git.orig/wcsmbs/wcstold_l.c | ||
933 | +++ git/wcsmbs/wcstold_l.c | ||
934 | @@ -24,8 +24,5 @@ | ||
935 | |||
936 | extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **, int, | ||
937 | __locale_t); | ||
938 | -extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, | ||
939 | - wchar_t **, int, int, | ||
940 | - __locale_t); | ||
941 | |||
942 | #include <strtold_l.c> | ||
943 | Index: git/wcsmbs/wcstold_nan.c | ||
944 | =================================================================== | ||
945 | --- /dev/null | ||
946 | +++ git/wcsmbs/wcstold_nan.c | ||
947 | @@ -0,0 +1,30 @@ | ||
948 | +/* Convert string for NaN payload to corresponding NaN. Wide strings, | ||
949 | + long double. | ||
950 | + Copyright (C) 2015 Free Software Foundation, Inc. | ||
951 | + This file is part of the GNU C Library. | ||
952 | + | ||
953 | + The GNU C Library is free software; you can redistribute it and/or | ||
954 | + modify it under the terms of the GNU Lesser General Public | ||
955 | + License as published by the Free Software Foundation; either | ||
956 | + version 2.1 of the License, or (at your option) any later version. | ||
957 | + | ||
958 | + The GNU C Library is distributed in the hope that it will be useful, | ||
959 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
960 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
961 | + Lesser General Public License for more details. | ||
962 | + | ||
963 | + You should have received a copy of the GNU Lesser General Public | ||
964 | + License along with the GNU C Library; if not, see | ||
965 | + <http://www.gnu.org/licenses/>. */ | ||
966 | + | ||
967 | +#include <math.h> | ||
968 | + | ||
969 | +/* This function is unused if long double and double have the same | ||
970 | + representation. */ | ||
971 | +#ifndef __NO_LONG_DOUBLE_MATH | ||
972 | +# include "../stdlib/strtod_nan_wide.h" | ||
973 | +# include <strtod_nan_ldouble.h> | ||
974 | + | ||
975 | +# define STRTOD_NAN __wcstold_nan | ||
976 | +# include "../stdlib/strtod_nan_main.c" | ||
977 | +#endif | ||
978 | Index: git/ChangeLog | ||
979 | =================================================================== | ||
980 | --- git.orig/ChangeLog | ||
981 | +++ git/ChangeLog | ||
982 | @@ -1,3 +1,57 @@ | ||
983 | +2015-11-24 Joseph Myers <joseph@codesourcery.com> | ||
984 | + | ||
985 | + * stdlib/strtod_nan.c: New file. | ||
986 | + * stdlib/strtod_nan_double.h: Likewise. | ||
987 | + * stdlib/strtod_nan_float.h: Likewise. | ||
988 | + * stdlib/strtod_nan_main.c: Likewise. | ||
989 | + * stdlib/strtod_nan_narrow.h: Likewise. | ||
990 | + * stdlib/strtod_nan_wide.h: Likewise. | ||
991 | + * stdlib/strtof_nan.c: Likewise. | ||
992 | + * stdlib/strtold_nan.c: Likewise. | ||
993 | + * sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h: Likewise. | ||
994 | + * sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h: Likewise. | ||
995 | + * sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h: Likewise. | ||
996 | + * wcsmbs/wcstod_nan.c: Likewise. | ||
997 | + * wcsmbs/wcstof_nan.c: Likewise. | ||
998 | + * wcsmbs/wcstold_nan.c: Likewise. | ||
999 | + * stdlib/Makefile (routines): Add strtof_nan, strtod_nan and | ||
1000 | + strtold_nan. | ||
1001 | + * wcsmbs/Makefile (routines): Add wcstod_nan, wcstold_nan and | ||
1002 | + wcstof_nan. | ||
1003 | + * include/stdlib.h (__strtof_nan): Declare and use | ||
1004 | + libc_hidden_proto. | ||
1005 | + (__strtod_nan): Likewise. | ||
1006 | + (__strtold_nan): Likewise. | ||
1007 | + (__wcstof_nan): Likewise. | ||
1008 | + (__wcstod_nan): Likewise. | ||
1009 | + (__wcstold_nan): Likewise. | ||
1010 | + * include/wchar.h (____wcstoull_l_internal): Declare. | ||
1011 | + * stdlib/strtod_l.c: Do not include <ieee754.h>. | ||
1012 | + (____strtoull_l_internal): Remove declaration. | ||
1013 | + (STRTOF_NAN): Define macro. | ||
1014 | + (SET_MANTISSA): Remove macro. | ||
1015 | + (STRTOULL): Likewise. | ||
1016 | + (____STRTOF_INTERNAL): Use STRTOF_NAN to parse NaN payload. | ||
1017 | + * stdlib/strtof_l.c (____strtoull_l_internal): Remove declaration. | ||
1018 | + (STRTOF_NAN): Define macro. | ||
1019 | + (SET_MANTISSA): Remove macro. | ||
1020 | + * sysdeps/ieee754/ldbl-128/strtold_l.c (STRTOF_NAN): Define macro. | ||
1021 | + (SET_MANTISSA): Remove macro. | ||
1022 | + * sysdeps/ieee754/ldbl-128ibm/strtold_l.c (STRTOF_NAN): Define | ||
1023 | + macro. | ||
1024 | + (SET_MANTISSA): Remove macro. | ||
1025 | + * sysdeps/ieee754/ldbl-64-128/strtold_l.c (STRTOF_NAN): Define | ||
1026 | + macro. | ||
1027 | + (SET_MANTISSA): Remove macro. | ||
1028 | + * sysdeps/ieee754/ldbl-96/strtold_l.c (STRTOF_NAN): Define macro. | ||
1029 | + (SET_MANTISSA): Remove macro. | ||
1030 | + * wcsmbs/wcstod_l.c (____wcstoull_l_internal): Remove declaration. | ||
1031 | + * wcsmbs/wcstof_l.c (____wcstoull_l_internal): Likewise. | ||
1032 | + * wcsmbs/wcstold_l.c (____wcstoull_l_internal): Likewise. | ||
1033 | + | ||
1034 | + [BZ #19266] | ||
1035 | + * stdlib/strtod_l.c (____STRTOF_INTERNAL): Check directly for | ||
1036 | + upper case and lower case letters inside NAN(), not using TOLOWER. | ||
1037 | 2015-08-08 Paul Pluzhnikov <ppluzhnikov@google.com> | ||
1038 | |||
1039 | [BZ #17905] | ||
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch b/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch deleted file mode 100644 index e30307fbc0..0000000000 --- a/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch +++ /dev/null | |||
@@ -1,385 +0,0 @@ | |||
1 | From 8f5e8b01a1da2a207228f2072c934fa5918554b8 Mon Sep 17 00:00:00 2001 | ||
2 | From: Joseph Myers <joseph@codesourcery.com> | ||
3 | Date: Fri, 4 Dec 2015 20:36:28 +0000 | ||
4 | Subject: [PATCH] Fix nan functions handling of payload strings (bug 16961, bug | ||
5 | 16962). | ||
6 | |||
7 | The nan, nanf and nanl functions handle payload strings by doing e.g.: | ||
8 | |||
9 | if (tagp[0] != '\0') | ||
10 | { | ||
11 | char buf[6 + strlen (tagp)]; | ||
12 | sprintf (buf, "NAN(%s)", tagp); | ||
13 | return strtod (buf, NULL); | ||
14 | } | ||
15 | |||
16 | This is an unbounded stack allocation based on the length of the | ||
17 | argument. Furthermore, if the argument starts with an n-char-sequence | ||
18 | followed by ')', that n-char-sequence is wrongly treated as | ||
19 | significant for determining the payload of the resulting NaN, when ISO | ||
20 | C says the call should be equivalent to strtod ("NAN", NULL), without | ||
21 | being affected by that initial n-char-sequence. This patch fixes both | ||
22 | those problems by using the __strtod_nan etc. functions recently | ||
23 | factored out of strtod etc. for that purpose, with those functions | ||
24 | being exported from libc at version GLIBC_PRIVATE. | ||
25 | |||
26 | Tested for x86_64, x86, mips64 and powerpc. | ||
27 | |||
28 | [BZ #16961] | ||
29 | [BZ #16962] | ||
30 | * math/s_nan.c (__nan): Use __strtod_nan instead of constructing a | ||
31 | string on the stack for strtod. | ||
32 | * math/s_nanf.c (__nanf): Use __strtof_nan instead of constructing | ||
33 | a string on the stack for strtof. | ||
34 | * math/s_nanl.c (__nanl): Use __strtold_nan instead of | ||
35 | constructing a string on the stack for strtold. | ||
36 | * stdlib/Versions (libc): Add __strtof_nan, __strtod_nan and | ||
37 | __strtold_nan to GLIBC_PRIVATE. | ||
38 | * math/test-nan-overflow.c: New file. | ||
39 | * math/test-nan-payload.c: Likewise. | ||
40 | * math/Makefile (tests): Add test-nan-overflow and | ||
41 | test-nan-payload. | ||
42 | |||
43 | Upstream-Status: Backport | ||
44 | CVE: CVE-2015-9761 patch #2 | ||
45 | [Yocto # 8980] | ||
46 | |||
47 | https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=8f5e8b01a1da2a207228f2072c934fa5918554b8 | ||
48 | |||
49 | Signed-off-by: Armin Kuster <akuster@mvista.com> | ||
50 | |||
51 | --- | ||
52 | ChangeLog | 17 +++++++ | ||
53 | NEWS | 6 +++ | ||
54 | math/Makefile | 3 +- | ||
55 | math/s_nan.c | 9 +--- | ||
56 | math/s_nanf.c | 9 +--- | ||
57 | math/s_nanl.c | 9 +--- | ||
58 | math/test-nan-overflow.c | 66 +++++++++++++++++++++++++ | ||
59 | math/test-nan-payload.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++ | ||
60 | stdlib/Versions | 1 + | ||
61 | 9 files changed, 217 insertions(+), 25 deletions(-) | ||
62 | create mode 100644 math/test-nan-overflow.c | ||
63 | create mode 100644 math/test-nan-payload.c | ||
64 | |||
65 | Index: git/ChangeLog | ||
66 | =================================================================== | ||
67 | --- git.orig/ChangeLog | ||
68 | +++ git/ChangeLog | ||
69 | @@ -1,3 +1,20 @@ | ||
70 | +2015-12-04 Joseph Myers <joseph@codesourcery.com> | ||
71 | + | ||
72 | + [BZ #16961] | ||
73 | + [BZ #16962] | ||
74 | + * math/s_nan.c (__nan): Use __strtod_nan instead of constructing a | ||
75 | + string on the stack for strtod. | ||
76 | + * math/s_nanf.c (__nanf): Use __strtof_nan instead of constructing | ||
77 | + a string on the stack for strtof. | ||
78 | + * math/s_nanl.c (__nanl): Use __strtold_nan instead of | ||
79 | + constructing a string on the stack for strtold. | ||
80 | + * stdlib/Versions (libc): Add __strtof_nan, __strtod_nan and | ||
81 | + __strtold_nan to GLIBC_PRIVATE. | ||
82 | + * math/test-nan-overflow.c: New file. | ||
83 | + * math/test-nan-payload.c: Likewise. | ||
84 | + * math/Makefile (tests): Add test-nan-overflow and | ||
85 | + test-nan-payload. | ||
86 | + | ||
87 | 2015-11-24 Joseph Myers <joseph@codesourcery.com> | ||
88 | |||
89 | * stdlib/strtod_nan.c: New file. | ||
90 | Index: git/NEWS | ||
91 | =================================================================== | ||
92 | --- git.orig/NEWS | ||
93 | +++ git/NEWS | ||
94 | @@ -99,6 +99,12 @@ Version 2.22 | ||
95 | |||
96 | Version 2.21 | ||
97 | |||
98 | +Security related changes: | ||
99 | + | ||
100 | +* The nan, nanf and nanl functions no longer have unbounded stack usage | ||
101 | + depending on the length of the string passed as an argument to the | ||
102 | + functions. Reported by Joseph Myers. | ||
103 | + | ||
104 | * The following bugs are resolved with this release: | ||
105 | |||
106 | 6652, 10672, 12674, 12847, 12926, 13862, 14132, 14138, 14171, 14498, | ||
107 | Index: git/math/Makefile | ||
108 | =================================================================== | ||
109 | --- git.orig/math/Makefile | ||
110 | +++ git/math/Makefile | ||
111 | @@ -110,6 +110,7 @@ tests = test-matherr test-fenv atest-exp | ||
112 | test-tgmath-ret bug-nextafter bug-nexttoward bug-tgmath1 \ | ||
113 | test-tgmath-int test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 test-snan \ | ||
114 | test-fenv-tls test-fenv-preserve test-fenv-return test-fenvinline \ | ||
115 | + test-nan-overflow test-nan-payload \ | ||
116 | $(tests-static) | ||
117 | tests-static = test-fpucw-static test-fpucw-ieee-static | ||
118 | # We do the `long double' tests only if this data type is available and | ||
119 | Index: git/math/s_nan.c | ||
120 | =================================================================== | ||
121 | --- git.orig/math/s_nan.c | ||
122 | +++ git/math/s_nan.c | ||
123 | @@ -28,14 +28,7 @@ | ||
124 | double | ||
125 | __nan (const char *tagp) | ||
126 | { | ||
127 | - if (tagp[0] != '\0') | ||
128 | - { | ||
129 | - char buf[6 + strlen (tagp)]; | ||
130 | - sprintf (buf, "NAN(%s)", tagp); | ||
131 | - return strtod (buf, NULL); | ||
132 | - } | ||
133 | - | ||
134 | - return NAN; | ||
135 | + return __strtod_nan (tagp, NULL, 0); | ||
136 | } | ||
137 | weak_alias (__nan, nan) | ||
138 | #ifdef NO_LONG_DOUBLE | ||
139 | Index: git/math/s_nanf.c | ||
140 | =================================================================== | ||
141 | --- git.orig/math/s_nanf.c | ||
142 | +++ git/math/s_nanf.c | ||
143 | @@ -28,13 +28,6 @@ | ||
144 | float | ||
145 | __nanf (const char *tagp) | ||
146 | { | ||
147 | - if (tagp[0] != '\0') | ||
148 | - { | ||
149 | - char buf[6 + strlen (tagp)]; | ||
150 | - sprintf (buf, "NAN(%s)", tagp); | ||
151 | - return strtof (buf, NULL); | ||
152 | - } | ||
153 | - | ||
154 | - return NAN; | ||
155 | + return __strtof_nan (tagp, NULL, 0); | ||
156 | } | ||
157 | weak_alias (__nanf, nanf) | ||
158 | Index: git/math/s_nanl.c | ||
159 | =================================================================== | ||
160 | --- git.orig/math/s_nanl.c | ||
161 | +++ git/math/s_nanl.c | ||
162 | @@ -28,13 +28,6 @@ | ||
163 | long double | ||
164 | __nanl (const char *tagp) | ||
165 | { | ||
166 | - if (tagp[0] != '\0') | ||
167 | - { | ||
168 | - char buf[6 + strlen (tagp)]; | ||
169 | - sprintf (buf, "NAN(%s)", tagp); | ||
170 | - return strtold (buf, NULL); | ||
171 | - } | ||
172 | - | ||
173 | - return NAN; | ||
174 | + return __strtold_nan (tagp, NULL, 0); | ||
175 | } | ||
176 | weak_alias (__nanl, nanl) | ||
177 | Index: git/math/test-nan-overflow.c | ||
178 | =================================================================== | ||
179 | --- /dev/null | ||
180 | +++ git/math/test-nan-overflow.c | ||
181 | @@ -0,0 +1,66 @@ | ||
182 | +/* Test nan functions stack overflow (bug 16962). | ||
183 | + Copyright (C) 2015 Free Software Foundation, Inc. | ||
184 | + This file is part of the GNU C Library. | ||
185 | + | ||
186 | + The GNU C Library is free software; you can redistribute it and/or | ||
187 | + modify it under the terms of the GNU Lesser General Public | ||
188 | + License as published by the Free Software Foundation; either | ||
189 | + version 2.1 of the License, or (at your option) any later version. | ||
190 | + | ||
191 | + The GNU C Library is distributed in the hope that it will be useful, | ||
192 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
193 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
194 | + Lesser General Public License for more details. | ||
195 | + | ||
196 | + You should have received a copy of the GNU Lesser General Public | ||
197 | + License along with the GNU C Library; if not, see | ||
198 | + <http://www.gnu.org/licenses/>. */ | ||
199 | + | ||
200 | +#include <math.h> | ||
201 | +#include <stdio.h> | ||
202 | +#include <string.h> | ||
203 | +#include <sys/resource.h> | ||
204 | + | ||
205 | +#define STACK_LIM 1048576 | ||
206 | +#define STRING_SIZE (2 * STACK_LIM) | ||
207 | + | ||
208 | +static int | ||
209 | +do_test (void) | ||
210 | +{ | ||
211 | + int result = 0; | ||
212 | + struct rlimit lim; | ||
213 | + getrlimit (RLIMIT_STACK, &lim); | ||
214 | + lim.rlim_cur = STACK_LIM; | ||
215 | + setrlimit (RLIMIT_STACK, &lim); | ||
216 | + char *nanstr = malloc (STRING_SIZE); | ||
217 | + if (nanstr == NULL) | ||
218 | + { | ||
219 | + puts ("malloc failed, cannot test"); | ||
220 | + return 77; | ||
221 | + } | ||
222 | + memset (nanstr, '0', STRING_SIZE - 1); | ||
223 | + nanstr[STRING_SIZE - 1] = 0; | ||
224 | +#define NAN_TEST(TYPE, FUNC) \ | ||
225 | + do \ | ||
226 | + { \ | ||
227 | + char *volatile p = nanstr; \ | ||
228 | + volatile TYPE v = FUNC (p); \ | ||
229 | + if (isnan (v)) \ | ||
230 | + puts ("PASS: " #FUNC); \ | ||
231 | + else \ | ||
232 | + { \ | ||
233 | + puts ("FAIL: " #FUNC); \ | ||
234 | + result = 1; \ | ||
235 | + } \ | ||
236 | + } \ | ||
237 | + while (0) | ||
238 | + NAN_TEST (float, nanf); | ||
239 | + NAN_TEST (double, nan); | ||
240 | +#ifndef NO_LONG_DOUBLE | ||
241 | + NAN_TEST (long double, nanl); | ||
242 | +#endif | ||
243 | + return result; | ||
244 | +} | ||
245 | + | ||
246 | +#define TEST_FUNCTION do_test () | ||
247 | +#include "../test-skeleton.c" | ||
248 | Index: git/math/test-nan-payload.c | ||
249 | =================================================================== | ||
250 | --- /dev/null | ||
251 | +++ git/math/test-nan-payload.c | ||
252 | @@ -0,0 +1,122 @@ | ||
253 | +/* Test nan functions payload handling (bug 16961). | ||
254 | + Copyright (C) 2015 Free Software Foundation, Inc. | ||
255 | + This file is part of the GNU C Library. | ||
256 | + | ||
257 | + The GNU C Library is free software; you can redistribute it and/or | ||
258 | + modify it under the terms of the GNU Lesser General Public | ||
259 | + License as published by the Free Software Foundation; either | ||
260 | + version 2.1 of the License, or (at your option) any later version. | ||
261 | + | ||
262 | + The GNU C Library is distributed in the hope that it will be useful, | ||
263 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
264 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
265 | + Lesser General Public License for more details. | ||
266 | + | ||
267 | + You should have received a copy of the GNU Lesser General Public | ||
268 | + License along with the GNU C Library; if not, see | ||
269 | + <http://www.gnu.org/licenses/>. */ | ||
270 | + | ||
271 | +#include <float.h> | ||
272 | +#include <math.h> | ||
273 | +#include <stdio.h> | ||
274 | +#include <stdlib.h> | ||
275 | +#include <string.h> | ||
276 | + | ||
277 | +/* Avoid built-in functions. */ | ||
278 | +#define WRAP_NAN(FUNC, STR) \ | ||
279 | + ({ const char *volatile wns = (STR); FUNC (wns); }) | ||
280 | +#define WRAP_STRTO(FUNC, STR) \ | ||
281 | + ({ const char *volatile wss = (STR); FUNC (wss, NULL); }) | ||
282 | + | ||
283 | +#define CHECK_IS_NAN(TYPE, A) \ | ||
284 | + do \ | ||
285 | + { \ | ||
286 | + if (isnan (A)) \ | ||
287 | + puts ("PASS: " #TYPE " " #A); \ | ||
288 | + else \ | ||
289 | + { \ | ||
290 | + puts ("FAIL: " #TYPE " " #A); \ | ||
291 | + result = 1; \ | ||
292 | + } \ | ||
293 | + } \ | ||
294 | + while (0) | ||
295 | + | ||
296 | +#define CHECK_SAME_NAN(TYPE, A, B) \ | ||
297 | + do \ | ||
298 | + { \ | ||
299 | + if (memcmp (&(A), &(B), sizeof (A)) == 0) \ | ||
300 | + puts ("PASS: " #TYPE " " #A " = " #B); \ | ||
301 | + else \ | ||
302 | + { \ | ||
303 | + puts ("FAIL: " #TYPE " " #A " = " #B); \ | ||
304 | + result = 1; \ | ||
305 | + } \ | ||
306 | + } \ | ||
307 | + while (0) | ||
308 | + | ||
309 | +#define CHECK_DIFF_NAN(TYPE, A, B) \ | ||
310 | + do \ | ||
311 | + { \ | ||
312 | + if (memcmp (&(A), &(B), sizeof (A)) != 0) \ | ||
313 | + puts ("PASS: " #TYPE " " #A " != " #B); \ | ||
314 | + else \ | ||
315 | + { \ | ||
316 | + puts ("FAIL: " #TYPE " " #A " != " #B); \ | ||
317 | + result = 1; \ | ||
318 | + } \ | ||
319 | + } \ | ||
320 | + while (0) | ||
321 | + | ||
322 | +/* Cannot test payloads by memcmp for formats where NaNs have padding | ||
323 | + bits. */ | ||
324 | +#define CAN_TEST_EQ(MANT_DIG) ((MANT_DIG) != 64 && (MANT_DIG) != 106) | ||
325 | + | ||
326 | +#define RUN_TESTS(TYPE, SFUNC, FUNC, MANT_DIG) \ | ||
327 | + do \ | ||
328 | + { \ | ||
329 | + TYPE n123 = WRAP_NAN (FUNC, "123"); \ | ||
330 | + CHECK_IS_NAN (TYPE, n123); \ | ||
331 | + TYPE s123 = WRAP_STRTO (SFUNC, "NAN(123)"); \ | ||
332 | + CHECK_IS_NAN (TYPE, s123); \ | ||
333 | + TYPE n456 = WRAP_NAN (FUNC, "456"); \ | ||
334 | + CHECK_IS_NAN (TYPE, n456); \ | ||
335 | + TYPE s456 = WRAP_STRTO (SFUNC, "NAN(456)"); \ | ||
336 | + CHECK_IS_NAN (TYPE, s456); \ | ||
337 | + TYPE n123x = WRAP_NAN (FUNC, "123)"); \ | ||
338 | + CHECK_IS_NAN (TYPE, n123x); \ | ||
339 | + TYPE nemp = WRAP_NAN (FUNC, ""); \ | ||
340 | + CHECK_IS_NAN (TYPE, nemp); \ | ||
341 | + TYPE semp = WRAP_STRTO (SFUNC, "NAN()"); \ | ||
342 | + CHECK_IS_NAN (TYPE, semp); \ | ||
343 | + TYPE sx = WRAP_STRTO (SFUNC, "NAN"); \ | ||
344 | + CHECK_IS_NAN (TYPE, sx); \ | ||
345 | + if (CAN_TEST_EQ (MANT_DIG)) \ | ||
346 | + CHECK_SAME_NAN (TYPE, n123, s123); \ | ||
347 | + if (CAN_TEST_EQ (MANT_DIG)) \ | ||
348 | + CHECK_SAME_NAN (TYPE, n456, s456); \ | ||
349 | + if (CAN_TEST_EQ (MANT_DIG)) \ | ||
350 | + CHECK_SAME_NAN (TYPE, nemp, semp); \ | ||
351 | + if (CAN_TEST_EQ (MANT_DIG)) \ | ||
352 | + CHECK_SAME_NAN (TYPE, n123x, sx); \ | ||
353 | + CHECK_DIFF_NAN (TYPE, n123, n456); \ | ||
354 | + CHECK_DIFF_NAN (TYPE, n123, nemp); \ | ||
355 | + CHECK_DIFF_NAN (TYPE, n123, n123x); \ | ||
356 | + CHECK_DIFF_NAN (TYPE, n456, nemp); \ | ||
357 | + CHECK_DIFF_NAN (TYPE, n456, n123x); \ | ||
358 | + } \ | ||
359 | + while (0) | ||
360 | + | ||
361 | +static int | ||
362 | +do_test (void) | ||
363 | +{ | ||
364 | + int result = 0; | ||
365 | + RUN_TESTS (float, strtof, nanf, FLT_MANT_DIG); | ||
366 | + RUN_TESTS (double, strtod, nan, DBL_MANT_DIG); | ||
367 | +#ifndef NO_LONG_DOUBLE | ||
368 | + RUN_TESTS (long double, strtold, nanl, LDBL_MANT_DIG); | ||
369 | +#endif | ||
370 | + return result; | ||
371 | +} | ||
372 | + | ||
373 | +#define TEST_FUNCTION do_test () | ||
374 | +#include "../test-skeleton.c" | ||
375 | Index: git/stdlib/Versions | ||
376 | =================================================================== | ||
377 | --- git.orig/stdlib/Versions | ||
378 | +++ git/stdlib/Versions | ||
379 | @@ -118,5 +118,6 @@ libc { | ||
380 | # Used from other libraries | ||
381 | __libc_secure_getenv; | ||
382 | __call_tls_dtors; | ||
383 | + __strtof_nan; __strtod_nan; __strtold_nan; | ||
384 | } | ||
385 | } | ||