diff options
Diffstat (limited to 'meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch')
-rw-r--r-- | meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch | 1039 |
1 files changed, 0 insertions, 1039 deletions
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 @@ -From e02cabecf0d025ec4f4ddee290bdf7aadb873bb3 Mon Sep 17 00:00:00 2001 -From: Joseph Myers <joseph@codesourcery.com> -Date: Tue, 24 Nov 2015 22:24:52 +0000 -Subject: [PATCH] Refactor strtod parsing of NaN payloads. - -The nan* functions handle their string argument by constructing a -NAN(...) string on the stack as a VLA and passing it to strtod -functions. - -This approach has problems discussed in bug 16961 and bug 16962: the -stack usage is unbounded, and it gives incorrect results in certain -cases where the argument is not a valid n-char-sequence. - -The natural fix for both issues is to refactor the NaN payload parsing -out of strtod into a separate function that the nan* functions can -call directly, so that no temporary string needs constructing on the -stack at all. This patch does that refactoring in preparation for -fixing those bugs (but without actually using the new functions from -nan* - which will also require exporting them from libc at version -GLIBC_PRIVATE). This patch is not intended to change any user-visible -behavior, so no tests are added (fixes for the above bugs will of -course add tests for them). - -This patch builds on my recent fixes for strtol and strtod issues in -Turkish locales. Given those fixes, the parsing of NaN payloads is -locale-independent; thus, the new functions do not need to take a -locale_t argument. - -Tested for x86_64, x86, mips64 and powerpc. - - * stdlib/strtod_nan.c: New file. - * stdlib/strtod_nan_double.h: Likewise. - * stdlib/strtod_nan_float.h: Likewise. - * stdlib/strtod_nan_main.c: Likewise. - * stdlib/strtod_nan_narrow.h: Likewise. - * stdlib/strtod_nan_wide.h: Likewise. - * stdlib/strtof_nan.c: Likewise. - * stdlib/strtold_nan.c: Likewise. - * sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h: Likewise. - * sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h: Likewise. - * sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h: Likewise. - * wcsmbs/wcstod_nan.c: Likewise. - * wcsmbs/wcstof_nan.c: Likewise. - * wcsmbs/wcstold_nan.c: Likewise. - * stdlib/Makefile (routines): Add strtof_nan, strtod_nan and - strtold_nan. - * wcsmbs/Makefile (routines): Add wcstod_nan, wcstold_nan and - wcstof_nan. - * include/stdlib.h (__strtof_nan): Declare and use - libc_hidden_proto. - (__strtod_nan): Likewise. - (__strtold_nan): Likewise. - (__wcstof_nan): Likewise. - (__wcstod_nan): Likewise. - (__wcstold_nan): Likewise. - * include/wchar.h (____wcstoull_l_internal): Declare. - * stdlib/strtod_l.c: Do not include <ieee754.h>. - (____strtoull_l_internal): Remove declaration. - (STRTOF_NAN): Define macro. - (SET_MANTISSA): Remove macro. - (STRTOULL): Likewise. - (____STRTOF_INTERNAL): Use STRTOF_NAN to parse NaN payload. - * stdlib/strtof_l.c (____strtoull_l_internal): Remove declaration. - (STRTOF_NAN): Define macro. - (SET_MANTISSA): Remove macro. - * sysdeps/ieee754/ldbl-128/strtold_l.c (STRTOF_NAN): Define macro. - (SET_MANTISSA): Remove macro. - * sysdeps/ieee754/ldbl-128ibm/strtold_l.c (STRTOF_NAN): Define - macro. - (SET_MANTISSA): Remove macro. - * sysdeps/ieee754/ldbl-64-128/strtold_l.c (STRTOF_NAN): Define - macro. - (SET_MANTISSA): Remove macro. - * sysdeps/ieee754/ldbl-96/strtold_l.c (STRTOF_NAN): Define macro. - (SET_MANTISSA): Remove macro. - * wcsmbs/wcstod_l.c (____wcstoull_l_internal): Remove declaration. - * wcsmbs/wcstof_l.c (____wcstoull_l_internal): Likewise. - * wcsmbs/wcstold_l.c (____wcstoull_l_internal): Likewise. - -Upstream-Status: Backport -CVE: CVE-2015-9761 patch #1 -[Yocto # 8980] - -https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=e02cabecf0d025ec4f4ddee290bdf7aadb873bb3 - -Signed-off-by: Armin Kuster <akuster@mvista.com> - ---- - ChangeLog | 49 ++++++++++++++++++ - include/stdlib.h | 18 +++++++ - include/wchar.h | 3 ++ - stdlib/Makefile | 1 + - stdlib/strtod_l.c | 48 ++++-------------- - stdlib/strtod_nan.c | 24 +++++++++ - stdlib/strtod_nan_double.h | 30 +++++++++++ - stdlib/strtod_nan_float.h | 29 +++++++++++ - stdlib/strtod_nan_main.c | 63 ++++++++++++++++++++++++ - stdlib/strtod_nan_narrow.h | 22 +++++++++ - stdlib/strtod_nan_wide.h | 22 +++++++++ - stdlib/strtof_l.c | 11 +---- - stdlib/strtof_nan.c | 24 +++++++++ - stdlib/strtold_nan.c | 30 +++++++++++ - sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h | 33 +++++++++++++ - sysdeps/ieee754/ldbl-128/strtold_l.c | 13 +---- - sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h | 30 +++++++++++ - sysdeps/ieee754/ldbl-128ibm/strtold_l.c | 10 +--- - sysdeps/ieee754/ldbl-64-128/strtold_l.c | 13 +---- - sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h | 30 +++++++++++ - sysdeps/ieee754/ldbl-96/strtold_l.c | 10 +--- - wcsmbs/Makefile | 1 + - wcsmbs/wcstod_l.c | 3 -- - wcsmbs/wcstod_nan.c | 23 +++++++++ - wcsmbs/wcstof_l.c | 3 -- - wcsmbs/wcstof_nan.c | 23 +++++++++ - wcsmbs/wcstold_l.c | 3 -- - wcsmbs/wcstold_nan.c | 30 +++++++++++ - 28 files changed, 504 insertions(+), 95 deletions(-) - create mode 100644 stdlib/strtod_nan.c - create mode 100644 stdlib/strtod_nan_double.h - create mode 100644 stdlib/strtod_nan_float.h - create mode 100644 stdlib/strtod_nan_main.c - create mode 100644 stdlib/strtod_nan_narrow.h - create mode 100644 stdlib/strtod_nan_wide.h - create mode 100644 stdlib/strtof_nan.c - create mode 100644 stdlib/strtold_nan.c - create mode 100644 sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h - create mode 100644 sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h - create mode 100644 sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h - create mode 100644 wcsmbs/wcstod_nan.c - create mode 100644 wcsmbs/wcstof_nan.c - create mode 100644 wcsmbs/wcstold_nan.c - -Index: git/include/stdlib.h -=================================================================== ---- git.orig/include/stdlib.h -+++ git/include/stdlib.h -@@ -203,6 +203,24 @@ libc_hidden_proto (strtoll) - libc_hidden_proto (strtoul) - libc_hidden_proto (strtoull) - -+extern float __strtof_nan (const char *, char **, char) internal_function; -+extern double __strtod_nan (const char *, char **, char) internal_function; -+extern long double __strtold_nan (const char *, char **, char) -+ internal_function; -+extern float __wcstof_nan (const wchar_t *, wchar_t **, wchar_t) -+ internal_function; -+extern double __wcstod_nan (const wchar_t *, wchar_t **, wchar_t) -+ internal_function; -+extern long double __wcstold_nan (const wchar_t *, wchar_t **, wchar_t) -+ internal_function; -+ -+libc_hidden_proto (__strtof_nan) -+libc_hidden_proto (__strtod_nan) -+libc_hidden_proto (__strtold_nan) -+libc_hidden_proto (__wcstof_nan) -+libc_hidden_proto (__wcstod_nan) -+libc_hidden_proto (__wcstold_nan) -+ - extern char *__ecvt (double __value, int __ndigit, int *__restrict __decpt, - int *__restrict __sign); - extern char *__fcvt (double __value, int __ndigit, int *__restrict __decpt, -Index: git/include/wchar.h -=================================================================== ---- git.orig/include/wchar.h -+++ git/include/wchar.h -@@ -52,6 +52,9 @@ extern unsigned long long int __wcstoull - __restrict __endptr, - int __base, - int __group) __THROW; -+extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, -+ wchar_t **, int, int, -+ __locale_t); - libc_hidden_proto (__wcstof_internal) - libc_hidden_proto (__wcstod_internal) - libc_hidden_proto (__wcstold_internal) -Index: git/stdlib/Makefile -=================================================================== ---- git.orig/stdlib/Makefile -+++ git/stdlib/Makefile -@@ -51,6 +51,7 @@ routines-y := \ - strtol_l strtoul_l strtoll_l strtoull_l \ - strtof strtod strtold \ - strtof_l strtod_l strtold_l \ -+ strtof_nan strtod_nan strtold_nan \ - system canonicalize \ - a64l l64a \ - getsubopt xpg_basename \ -Index: git/stdlib/strtod_l.c -=================================================================== ---- git.orig/stdlib/strtod_l.c -+++ git/stdlib/strtod_l.c -@@ -21,8 +21,6 @@ - #include <xlocale.h> - - extern double ____strtod_l_internal (const char *, char **, int, __locale_t); --extern unsigned long long int ____strtoull_l_internal (const char *, char **, -- int, int, __locale_t); - - /* Configuration part. These macros are defined by `strtold.c', - `strtof.c', `wcstod.c', `wcstold.c', and `wcstof.c' to produce the -@@ -34,27 +32,20 @@ extern unsigned long long int ____strtou - # ifdef USE_WIDE_CHAR - # define STRTOF wcstod_l - # define __STRTOF __wcstod_l -+# define STRTOF_NAN __wcstod_nan - # else - # define STRTOF strtod_l - # define __STRTOF __strtod_l -+# define STRTOF_NAN __strtod_nan - # endif - # define MPN2FLOAT __mpn_construct_double - # define FLOAT_HUGE_VAL HUGE_VAL --# define SET_MANTISSA(flt, mant) \ -- do { union ieee754_double u; \ -- u.d = (flt); \ -- u.ieee_nan.mantissa0 = (mant) >> 32; \ -- u.ieee_nan.mantissa1 = (mant); \ -- if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ -- (flt) = u.d; \ -- } while (0) - #endif - /* End of configuration part. */ - - #include <ctype.h> - #include <errno.h> - #include <float.h> --#include <ieee754.h> - #include "../locale/localeinfo.h" - #include <locale.h> - #include <math.h> -@@ -105,7 +96,6 @@ extern unsigned long long int ____strtou - # define TOLOWER_C(Ch) __towlower_l ((Ch), _nl_C_locobj_ptr) - # define STRNCASECMP(S1, S2, N) \ - __wcsncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr) --# define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, loc) - #else - # define STRING_TYPE char - # define CHAR_TYPE char -@@ -117,7 +107,6 @@ extern unsigned long long int ____strtou - # define TOLOWER_C(Ch) __tolower_l ((Ch), _nl_C_locobj_ptr) - # define STRNCASECMP(S1, S2, N) \ - __strncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr) --# define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, loc) - #endif - - -@@ -668,33 +657,14 @@ ____STRTOF_INTERNAL (nptr, endptr, group - if (*cp == L_('(')) - { - const STRING_TYPE *startp = cp; -- do -- ++cp; -- while ((*cp >= L_('0') && *cp <= L_('9')) -- || ({ CHAR_TYPE lo = TOLOWER (*cp); -- lo >= L_('a') && lo <= L_('z'); }) -- || *cp == L_('_')); -- -- if (*cp != L_(')')) -- /* The closing brace is missing. Only match the NAN -- part. */ -- cp = startp; -+ STRING_TYPE *endp; -+ retval = STRTOF_NAN (cp + 1, &endp, L_(')')); -+ if (*endp == L_(')')) -+ /* Consume the closing parenthesis. */ -+ cp = endp + 1; - else -- { -- /* This is a system-dependent way to specify the -- bitmask used for the NaN. We expect it to be -- a number which is put in the mantissa of the -- number. */ -- STRING_TYPE *endp; -- unsigned long long int mant; -- -- mant = STRTOULL (startp + 1, &endp, 0); -- if (endp == cp) -- SET_MANTISSA (retval, mant); -- -- /* Consume the closing brace. */ -- ++cp; -- } -+ /* Only match the NAN part. */ -+ cp = startp; - } - - if (endptr != NULL) -Index: git/stdlib/strtod_nan.c -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan.c -@@ -0,0 +1,24 @@ -+/* Convert string for NaN payload to corresponding NaN. Narrow -+ strings, double. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <strtod_nan_narrow.h> -+#include <strtod_nan_double.h> -+ -+#define STRTOD_NAN __strtod_nan -+#include <strtod_nan_main.c> -Index: git/stdlib/strtod_nan_double.h -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_double.h -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. For double. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT double -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ieee754_double u; \ -+ u.d = (flt); \ -+ u.ieee_nan.mantissa0 = (mant) >> 32; \ -+ u.ieee_nan.mantissa1 = (mant); \ -+ if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ -+ (flt) = u.d; \ -+ } \ -+ while (0) -Index: git/stdlib/strtod_nan_float.h -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_float.h -@@ -0,0 +1,29 @@ -+/* Convert string for NaN payload to corresponding NaN. For float. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT float -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ieee754_float u; \ -+ u.f = (flt); \ -+ u.ieee_nan.mantissa = (mant); \ -+ if (u.ieee.mantissa != 0) \ -+ (flt) = u.f; \ -+ } \ -+ while (0) -Index: git/stdlib/strtod_nan_main.c -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_main.c -@@ -0,0 +1,63 @@ -+/* Convert string for NaN payload to corresponding NaN. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <ieee754.h> -+#include <locale.h> -+#include <math.h> -+#include <stdlib.h> -+#include <wchar.h> -+ -+ -+/* If STR starts with an optional n-char-sequence as defined by ISO C -+ (a sequence of ASCII letters, digits and underscores), followed by -+ ENDC, return a NaN whose payload is set based on STR. Otherwise, -+ return a default NAN. If ENDPTR is not NULL, set *ENDPTR to point -+ to the character after the initial n-char-sequence. */ -+ -+internal_function -+FLOAT -+STRTOD_NAN (const STRING_TYPE *str, STRING_TYPE **endptr, STRING_TYPE endc) -+{ -+ const STRING_TYPE *cp = str; -+ -+ while ((*cp >= L_('0') && *cp <= L_('9')) -+ || (*cp >= L_('A') && *cp <= L_('Z')) -+ || (*cp >= L_('a') && *cp <= L_('z')) -+ || *cp == L_('_')) -+ ++cp; -+ -+ FLOAT retval = NAN; -+ if (*cp != endc) -+ goto out; -+ -+ /* This is a system-dependent way to specify the bitmask used for -+ the NaN. We expect it to be a number which is put in the -+ mantissa of the number. */ -+ STRING_TYPE *endp; -+ unsigned long long int mant; -+ -+ mant = STRTOULL (str, &endp, 0); -+ if (endp == cp) -+ SET_MANTISSA (retval, mant); -+ -+ out: -+ if (endptr != NULL) -+ *endptr = (STRING_TYPE *) cp; -+ return retval; -+} -+libc_hidden_def (STRTOD_NAN) -Index: git/stdlib/strtod_nan_narrow.h -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_narrow.h -@@ -0,0 +1,22 @@ -+/* Convert string for NaN payload to corresponding NaN. Narrow strings. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define STRING_TYPE char -+#define L_(Ch) Ch -+#define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, \ -+ _nl_C_locobj_ptr) -Index: git/stdlib/strtod_nan_wide.h -=================================================================== ---- /dev/null -+++ git/stdlib/strtod_nan_wide.h -@@ -0,0 +1,22 @@ -+/* Convert string for NaN payload to corresponding NaN. Wide strings. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define STRING_TYPE wchar_t -+#define L_(Ch) L##Ch -+#define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, \ -+ _nl_C_locobj_ptr) -Index: git/stdlib/strtof_l.c -=================================================================== ---- git.orig/stdlib/strtof_l.c -+++ git/stdlib/strtof_l.c -@@ -20,26 +20,19 @@ - #include <xlocale.h> - - extern float ____strtof_l_internal (const char *, char **, int, __locale_t); --extern unsigned long long int ____strtoull_l_internal (const char *, char **, -- int, int, __locale_t); - - #define FLOAT float - #define FLT FLT - #ifdef USE_WIDE_CHAR - # define STRTOF wcstof_l - # define __STRTOF __wcstof_l -+# define STRTOF_NAN __wcstof_nan - #else - # define STRTOF strtof_l - # define __STRTOF __strtof_l -+# define STRTOF_NAN __strtof_nan - #endif - #define MPN2FLOAT __mpn_construct_float - #define FLOAT_HUGE_VAL HUGE_VALF --#define SET_MANTISSA(flt, mant) \ -- do { union ieee754_float u; \ -- u.f = (flt); \ -- u.ieee_nan.mantissa = (mant); \ -- if (u.ieee.mantissa != 0) \ -- (flt) = u.f; \ -- } while (0) - - #include "strtod_l.c" -Index: git/stdlib/strtof_nan.c -=================================================================== ---- /dev/null -+++ git/stdlib/strtof_nan.c -@@ -0,0 +1,24 @@ -+/* Convert string for NaN payload to corresponding NaN. Narrow -+ strings, float. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <strtod_nan_narrow.h> -+#include <strtod_nan_float.h> -+ -+#define STRTOD_NAN __strtof_nan -+#include <strtod_nan_main.c> -Index: git/stdlib/strtold_nan.c -=================================================================== ---- /dev/null -+++ git/stdlib/strtold_nan.c -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. Narrow -+ strings, long double. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <math.h> -+ -+/* This function is unused if long double and double have the same -+ representation. */ -+#ifndef __NO_LONG_DOUBLE_MATH -+# include <strtod_nan_narrow.h> -+# include <strtod_nan_ldouble.h> -+ -+# define STRTOD_NAN __strtold_nan -+# include <strtod_nan_main.c> -+#endif -Index: git/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h -=================================================================== ---- /dev/null -+++ git/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h -@@ -0,0 +1,33 @@ -+/* Convert string for NaN payload to corresponding NaN. For ldbl-128. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT long double -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ieee854_long_double u; \ -+ u.d = (flt); \ -+ u.ieee_nan.mantissa0 = 0; \ -+ u.ieee_nan.mantissa1 = 0; \ -+ u.ieee_nan.mantissa2 = (mant) >> 32; \ -+ u.ieee_nan.mantissa3 = (mant); \ -+ if ((u.ieee.mantissa0 | u.ieee.mantissa1 \ -+ | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \ -+ (flt) = u.d; \ -+ } \ -+ while (0) -Index: git/sysdeps/ieee754/ldbl-128/strtold_l.c -=================================================================== ---- git.orig/sysdeps/ieee754/ldbl-128/strtold_l.c -+++ git/sysdeps/ieee754/ldbl-128/strtold_l.c -@@ -25,22 +25,13 @@ - #ifdef USE_WIDE_CHAR - # define STRTOF wcstold_l - # define __STRTOF __wcstold_l -+# define STRTOF_NAN __wcstold_nan - #else - # define STRTOF strtold_l - # define __STRTOF __strtold_l -+# define STRTOF_NAN __strtold_nan - #endif - #define MPN2FLOAT __mpn_construct_long_double - #define FLOAT_HUGE_VAL HUGE_VALL --#define SET_MANTISSA(flt, mant) \ -- do { union ieee854_long_double u; \ -- u.d = (flt); \ -- u.ieee_nan.mantissa0 = 0; \ -- u.ieee_nan.mantissa1 = 0; \ -- u.ieee_nan.mantissa2 = (mant) >> 32; \ -- u.ieee_nan.mantissa3 = (mant); \ -- if ((u.ieee.mantissa0 | u.ieee.mantissa1 \ -- | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \ -- (flt) = u.d; \ -- } while (0) - - #include <strtod_l.c> -Index: git/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h -=================================================================== ---- /dev/null -+++ git/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. For ldbl-128ibm. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT long double -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ibm_extended_long_double u; \ -+ u.ld = (flt); \ -+ u.d[0].ieee_nan.mantissa0 = (mant) >> 32; \ -+ u.d[0].ieee_nan.mantissa1 = (mant); \ -+ if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0) \ -+ (flt) = u.ld; \ -+ } \ -+ while (0) -Index: git/sysdeps/ieee754/ldbl-128ibm/strtold_l.c -=================================================================== ---- git.orig/sysdeps/ieee754/ldbl-128ibm/strtold_l.c -+++ git/sysdeps/ieee754/ldbl-128ibm/strtold_l.c -@@ -30,25 +30,19 @@ extern long double ____new_wcstold_l (co - # define STRTOF __new_wcstold_l - # define __STRTOF ____new_wcstold_l - # define ____STRTOF_INTERNAL ____wcstold_l_internal -+# define STRTOF_NAN __wcstold_nan - #else - extern long double ____new_strtold_l (const char *, char **, __locale_t); - # define STRTOF __new_strtold_l - # define __STRTOF ____new_strtold_l - # define ____STRTOF_INTERNAL ____strtold_l_internal -+# define STRTOF_NAN __strtold_nan - #endif - extern __typeof (__STRTOF) STRTOF; - libc_hidden_proto (__STRTOF) - libc_hidden_proto (STRTOF) - #define MPN2FLOAT __mpn_construct_long_double - #define FLOAT_HUGE_VAL HUGE_VALL --# define SET_MANTISSA(flt, mant) \ -- do { union ibm_extended_long_double u; \ -- u.ld = (flt); \ -- u.d[0].ieee_nan.mantissa0 = (mant) >> 32; \ -- u.d[0].ieee_nan.mantissa1 = (mant); \ -- if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0) \ -- (flt) = u.ld; \ -- } while (0) - - #include <strtod_l.c> - -Index: git/sysdeps/ieee754/ldbl-64-128/strtold_l.c -=================================================================== ---- git.orig/sysdeps/ieee754/ldbl-64-128/strtold_l.c -+++ git/sysdeps/ieee754/ldbl-64-128/strtold_l.c -@@ -30,28 +30,19 @@ extern long double ____new_wcstold_l (co - # define STRTOF __new_wcstold_l - # define __STRTOF ____new_wcstold_l - # define ____STRTOF_INTERNAL ____wcstold_l_internal -+# define STRTOF_NAN __wcstold_nan - #else - extern long double ____new_strtold_l (const char *, char **, __locale_t); - # define STRTOF __new_strtold_l - # define __STRTOF ____new_strtold_l - # define ____STRTOF_INTERNAL ____strtold_l_internal -+# define STRTOF_NAN __strtold_nan - #endif - extern __typeof (__STRTOF) STRTOF; - libc_hidden_proto (__STRTOF) - libc_hidden_proto (STRTOF) - #define MPN2FLOAT __mpn_construct_long_double - #define FLOAT_HUGE_VAL HUGE_VALL --#define SET_MANTISSA(flt, mant) \ -- do { union ieee854_long_double u; \ -- u.d = (flt); \ -- u.ieee_nan.mantissa0 = 0; \ -- u.ieee_nan.mantissa1 = 0; \ -- u.ieee_nan.mantissa2 = (mant) >> 32; \ -- u.ieee_nan.mantissa3 = (mant); \ -- if ((u.ieee.mantissa0 | u.ieee.mantissa1 \ -- | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \ -- (flt) = u.d; \ -- } while (0) - - #include <strtod_l.c> - -Index: git/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h -=================================================================== ---- /dev/null -+++ git/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. For ldbl-96. -+ Copyright (C) 1997-2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#define FLOAT long double -+#define SET_MANTISSA(flt, mant) \ -+ do \ -+ { \ -+ union ieee854_long_double u; \ -+ u.d = (flt); \ -+ u.ieee_nan.mantissa0 = (mant) >> 32; \ -+ u.ieee_nan.mantissa1 = (mant); \ -+ if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ -+ (flt) = u.d; \ -+ } \ -+ while (0) -Index: git/sysdeps/ieee754/ldbl-96/strtold_l.c -=================================================================== ---- git.orig/sysdeps/ieee754/ldbl-96/strtold_l.c -+++ git/sysdeps/ieee754/ldbl-96/strtold_l.c -@@ -25,19 +25,13 @@ - #ifdef USE_WIDE_CHAR - # define STRTOF wcstold_l - # define __STRTOF __wcstold_l -+# define STRTOF_NAN __wcstold_nan - #else - # define STRTOF strtold_l - # define __STRTOF __strtold_l -+# define STRTOF_NAN __strtold_nan - #endif - #define MPN2FLOAT __mpn_construct_long_double - #define FLOAT_HUGE_VAL HUGE_VALL --#define SET_MANTISSA(flt, mant) \ -- do { union ieee854_long_double u; \ -- u.d = (flt); \ -- u.ieee_nan.mantissa0 = (mant) >> 32; \ -- u.ieee_nan.mantissa1 = (mant); \ -- if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ -- (flt) = u.d; \ -- } while (0) - - #include <stdlib/strtod_l.c> -Index: git/wcsmbs/Makefile -=================================================================== ---- git.orig/wcsmbs/Makefile -+++ git/wcsmbs/Makefile -@@ -39,6 +39,7 @@ routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR - wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \ - wcstol_l wcstoul_l wcstoll_l wcstoull_l \ - wcstod_l wcstold_l wcstof_l \ -+ wcstod_nan wcstold_nan wcstof_nan \ - wcscoll wcsxfrm \ - wcwidth wcswidth \ - wcscoll_l wcsxfrm_l \ -Index: git/wcsmbs/wcstod_l.c -=================================================================== ---- git.orig/wcsmbs/wcstod_l.c -+++ git/wcsmbs/wcstod_l.c -@@ -23,9 +23,6 @@ - - extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int, - __locale_t); --extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, -- wchar_t **, int, int, -- __locale_t); - - #define USE_WIDE_CHAR 1 - -Index: git/wcsmbs/wcstod_nan.c -=================================================================== ---- /dev/null -+++ git/wcsmbs/wcstod_nan.c -@@ -0,0 +1,23 @@ -+/* Convert string for NaN payload to corresponding NaN. Wide strings, double. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include "../stdlib/strtod_nan_wide.h" -+#include "../stdlib/strtod_nan_double.h" -+ -+#define STRTOD_NAN __wcstod_nan -+#include "../stdlib/strtod_nan_main.c" -Index: git/wcsmbs/wcstof_l.c -=================================================================== ---- git.orig/wcsmbs/wcstof_l.c -+++ git/wcsmbs/wcstof_l.c -@@ -25,8 +25,5 @@ - - extern float ____wcstof_l_internal (const wchar_t *, wchar_t **, int, - __locale_t); --extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, -- wchar_t **, int, int, -- __locale_t); - - #include <stdlib/strtof_l.c> -Index: git/wcsmbs/wcstof_nan.c -=================================================================== ---- /dev/null -+++ git/wcsmbs/wcstof_nan.c -@@ -0,0 +1,23 @@ -+/* Convert string for NaN payload to corresponding NaN. Wide strings, float. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include "../stdlib/strtod_nan_wide.h" -+#include "../stdlib/strtod_nan_float.h" -+ -+#define STRTOD_NAN __wcstof_nan -+#include "../stdlib/strtod_nan_main.c" -Index: git/wcsmbs/wcstold_l.c -=================================================================== ---- git.orig/wcsmbs/wcstold_l.c -+++ git/wcsmbs/wcstold_l.c -@@ -24,8 +24,5 @@ - - extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **, int, - __locale_t); --extern unsigned long long int ____wcstoull_l_internal (const wchar_t *, -- wchar_t **, int, int, -- __locale_t); - - #include <strtold_l.c> -Index: git/wcsmbs/wcstold_nan.c -=================================================================== ---- /dev/null -+++ git/wcsmbs/wcstold_nan.c -@@ -0,0 +1,30 @@ -+/* Convert string for NaN payload to corresponding NaN. Wide strings, -+ long double. -+ Copyright (C) 2015 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#include <math.h> -+ -+/* This function is unused if long double and double have the same -+ representation. */ -+#ifndef __NO_LONG_DOUBLE_MATH -+# include "../stdlib/strtod_nan_wide.h" -+# include <strtod_nan_ldouble.h> -+ -+# define STRTOD_NAN __wcstold_nan -+# include "../stdlib/strtod_nan_main.c" -+#endif -Index: git/ChangeLog -=================================================================== ---- git.orig/ChangeLog -+++ git/ChangeLog -@@ -1,3 +1,57 @@ -+2015-11-24 Joseph Myers <joseph@codesourcery.com> -+ -+ * stdlib/strtod_nan.c: New file. -+ * stdlib/strtod_nan_double.h: Likewise. -+ * stdlib/strtod_nan_float.h: Likewise. -+ * stdlib/strtod_nan_main.c: Likewise. -+ * stdlib/strtod_nan_narrow.h: Likewise. -+ * stdlib/strtod_nan_wide.h: Likewise. -+ * stdlib/strtof_nan.c: Likewise. -+ * stdlib/strtold_nan.c: Likewise. -+ * sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h: Likewise. -+ * sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h: Likewise. -+ * sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h: Likewise. -+ * wcsmbs/wcstod_nan.c: Likewise. -+ * wcsmbs/wcstof_nan.c: Likewise. -+ * wcsmbs/wcstold_nan.c: Likewise. -+ * stdlib/Makefile (routines): Add strtof_nan, strtod_nan and -+ strtold_nan. -+ * wcsmbs/Makefile (routines): Add wcstod_nan, wcstold_nan and -+ wcstof_nan. -+ * include/stdlib.h (__strtof_nan): Declare and use -+ libc_hidden_proto. -+ (__strtod_nan): Likewise. -+ (__strtold_nan): Likewise. -+ (__wcstof_nan): Likewise. -+ (__wcstod_nan): Likewise. -+ (__wcstold_nan): Likewise. -+ * include/wchar.h (____wcstoull_l_internal): Declare. -+ * stdlib/strtod_l.c: Do not include <ieee754.h>. -+ (____strtoull_l_internal): Remove declaration. -+ (STRTOF_NAN): Define macro. -+ (SET_MANTISSA): Remove macro. -+ (STRTOULL): Likewise. -+ (____STRTOF_INTERNAL): Use STRTOF_NAN to parse NaN payload. -+ * stdlib/strtof_l.c (____strtoull_l_internal): Remove declaration. -+ (STRTOF_NAN): Define macro. -+ (SET_MANTISSA): Remove macro. -+ * sysdeps/ieee754/ldbl-128/strtold_l.c (STRTOF_NAN): Define macro. -+ (SET_MANTISSA): Remove macro. -+ * sysdeps/ieee754/ldbl-128ibm/strtold_l.c (STRTOF_NAN): Define -+ macro. -+ (SET_MANTISSA): Remove macro. -+ * sysdeps/ieee754/ldbl-64-128/strtold_l.c (STRTOF_NAN): Define -+ macro. -+ (SET_MANTISSA): Remove macro. -+ * sysdeps/ieee754/ldbl-96/strtold_l.c (STRTOF_NAN): Define macro. -+ (SET_MANTISSA): Remove macro. -+ * wcsmbs/wcstod_l.c (____wcstoull_l_internal): Remove declaration. -+ * wcsmbs/wcstof_l.c (____wcstoull_l_internal): Likewise. -+ * wcsmbs/wcstold_l.c (____wcstoull_l_internal): Likewise. -+ -+ [BZ #19266] -+ * stdlib/strtod_l.c (____STRTOF_INTERNAL): Check directly for -+ upper case and lower case letters inside NAN(), not using TOLOWER. - 2015-08-08 Paul Pluzhnikov <ppluzhnikov@google.com> - - [BZ #17905] |