On Sun, Feb 28, 2016 at 10:53:34AM -0800, Armin Kuster wrote:
> From: Armin Kuster <akus...@mvista.com>

I think this is 2014-9761 not 2015-9761

But other than that please merge this series.

> A stack overflow vulnerability was found in nan* functions that could cause
> applications which process long strings with the nan function to crash or,
> potentially, execute arbitrary code.
> 
> (From OE-Core rev: fd3da8178c8c06b549dbc19ecec40e98ab934d49)
> 
> Signed-off-by: Armin Kuster <akus...@mvista.com>
> Signed-off-by: Robert Yang <liezhi.y...@windriver.com>
> Signed-off-by: Richard Purdie <richard.pur...@linuxfoundation.org>
> Signed-off-by: Armin Kuster <akus...@mvista.com>
> Signed-off-by: Richard Purdie <richard.pur...@linuxfoundation.org>
> Signed-off-by: Armin Kuster <akuster...@gmail.com>
> ---
>  .../recipes-core/glibc/glibc/CVE-2015-9761_1.patch | 1039 
> ++++++++++++++++++++
>  .../recipes-core/glibc/glibc/CVE-2015-9761_2.patch |  388 ++++++++
>  meta/recipes-core/glibc/glibc_2.20.bb              |    2 +
>  3 files changed, 1429 insertions(+)
>  create mode 100644 meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch
>  create mode 100644 meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch
> 
> diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch 
> b/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch
> new file mode 100644
> index 0000000..3aca913
> --- /dev/null
> +++ b/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch
> @@ -0,0 +1,1039 @@
> +From e02cabecf0d025ec4f4ddee290bdf7aadb873bb3 Mon Sep 17 00:00:00 2001
> +From: Joseph Myers <jos...@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 <akus...@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  <jos...@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  <ppluzhni...@google.com>
> + 
> +    [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
> new file mode 100644
> index 0000000..0df5e50
> --- /dev/null
> +++ b/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch
> @@ -0,0 +1,388 @@
> +From 8f5e8b01a1da2a207228f2072c934fa5918554b8 Mon Sep 17 00:00:00 2001
> +From: Joseph Myers <jos...@codesourcery.com>
> +Date: Fri, 4 Dec 2015 20:36:28 +0000
> +Subject: [PATCH] Fix nan functions handling of payload strings (bug 16961, 
> bug
> + 16962).
> +
> +The nan, nanf and nanl functions handle payload strings by doing e.g.:
> +
> +  if (tagp[0] != '\0')
> +    {
> +      char buf[6 + strlen (tagp)];
> +      sprintf (buf, "NAN(%s)", tagp);
> +      return strtod (buf, NULL);
> +    }
> +
> +This is an unbounded stack allocation based on the length of the
> +argument.  Furthermore, if the argument starts with an n-char-sequence
> +followed by ')', that n-char-sequence is wrongly treated as
> +significant for determining the payload of the resulting NaN, when ISO
> +C says the call should be equivalent to strtod ("NAN", NULL), without
> +being affected by that initial n-char-sequence.  This patch fixes both
> +those problems by using the __strtod_nan etc. functions recently
> +factored out of strtod etc. for that purpose, with those functions
> +being exported from libc at version GLIBC_PRIVATE.
> +
> +Tested for x86_64, x86, mips64 and powerpc.
> +
> +     [BZ #16961]
> +     [BZ #16962]
> +     * math/s_nan.c (__nan): Use __strtod_nan instead of constructing a
> +     string on the stack for strtod.
> +     * math/s_nanf.c (__nanf): Use __strtof_nan instead of constructing
> +     a string on the stack for strtof.
> +     * math/s_nanl.c (__nanl): Use __strtold_nan instead of
> +     constructing a string on the stack for strtold.
> +     * stdlib/Versions (libc): Add __strtof_nan, __strtod_nan and
> +     __strtold_nan to GLIBC_PRIVATE.
> +     * math/test-nan-overflow.c: New file.
> +     * math/test-nan-payload.c: Likewise.
> +     * math/Makefile (tests): Add test-nan-overflow and
> +     test-nan-payload.
> +
> +Upstream-Status: Backport
> +CVE: CVE-2015-9761 patch #2
> +[Yocto # 8980]
> +
> +https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=8f5e8b01a1da2a207228f2072c934fa5918554b8
> +
> +Signed-off-by: Armin Kuster <akus...@mvista.com>
> +
> +---
> + ChangeLog                |  17 +++++++
> + NEWS                     |   6 +++
> + math/Makefile            |   3 +-
> + math/s_nan.c             |   9 +---
> + math/s_nanf.c            |   9 +---
> + math/s_nanl.c            |   9 +---
> + math/test-nan-overflow.c |  66 +++++++++++++++++++++++++
> + math/test-nan-payload.c  | 122 
> +++++++++++++++++++++++++++++++++++++++++++++++
> + stdlib/Versions          |   1 +
> + 9 files changed, 217 insertions(+), 25 deletions(-)
> + create mode 100644 math/test-nan-overflow.c
> + create mode 100644 math/test-nan-payload.c
> +
> +Index: git/ChangeLog
> +===================================================================
> +--- git.orig/ChangeLog
> ++++ git/ChangeLog
> +@@ -1,3 +1,20 @@
> ++2015-12-04  Joseph Myers  <jos...@codesourcery.com>
> ++
> ++    [BZ #16961]
> ++    [BZ #16962]
> ++    * math/s_nan.c (__nan): Use __strtod_nan instead of constructing a
> ++    string on the stack for strtod.
> ++    * math/s_nanf.c (__nanf): Use __strtof_nan instead of constructing
> ++    a string on the stack for strtof.
> ++    * math/s_nanl.c (__nanl): Use __strtold_nan instead of
> ++    constructing a string on the stack for strtold.
> ++    * stdlib/Versions (libc): Add __strtof_nan, __strtod_nan and
> ++    __strtold_nan to GLIBC_PRIVATE.
> ++    * math/test-nan-overflow.c: New file.
> ++    * math/test-nan-payload.c: Likewise.
> ++    * math/Makefile (tests): Add test-nan-overflow and
> ++    test-nan-payload.
> ++
> + 2015-11-24  Joseph Myers  <jos...@codesourcery.com>
> +  
> +     * stdlib/strtod_nan.c: New file.
> +Index: git/NEWS
> +===================================================================
> +--- git.orig/NEWS
> ++++ git/NEWS
> +@@ -7,6 +7,12 @@ using `glibc' in the "product" field.
> + 
> + Version 2.21
> + 
> ++Security related changes:
> ++
> ++* The nan, nanf and nanl functions no longer have unbounded stack usage
> ++  depending on the length of the string passed as an argument to the
> ++  functions.  Reported by Joseph Myers.
> ++
> + * The following bugs are resolved with this release:
> + 
> +   6652, 10672, 12674, 12847, 12926, 13862, 14132, 14138, 14171, 14498,
> +Index: git/math/s_nan.c
> +===================================================================
> +--- git.orig/math/s_nan.c
> ++++ git/math/s_nan.c
> +@@ -28,14 +28,7 @@
> + double
> + __nan (const char *tagp)
> + {
> +-  if (tagp[0] != '\0')
> +-    {
> +-      char buf[6 + strlen (tagp)];
> +-      sprintf (buf, "NAN(%s)", tagp);
> +-      return strtod (buf, NULL);
> +-    }
> +-
> +-  return NAN;
> ++  return __strtod_nan (tagp, NULL, 0);
> + }
> + weak_alias (__nan, nan)
> + #ifdef NO_LONG_DOUBLE
> +Index: git/math/s_nanf.c
> +===================================================================
> +--- git.orig/math/s_nanf.c
> ++++ git/math/s_nanf.c
> +@@ -28,13 +28,6 @@
> + float
> + __nanf (const char *tagp)
> + {
> +-  if (tagp[0] != '\0')
> +-    {
> +-      char buf[6 + strlen (tagp)];
> +-      sprintf (buf, "NAN(%s)", tagp);
> +-      return strtof (buf, NULL);
> +-    }
> +-
> +-  return NAN;
> ++  return __strtof_nan (tagp, NULL, 0);
> + }
> + weak_alias (__nanf, nanf)
> +Index: git/math/s_nanl.c
> +===================================================================
> +--- git.orig/math/s_nanl.c
> ++++ git/math/s_nanl.c
> +@@ -28,13 +28,6 @@
> + long double
> + __nanl (const char *tagp)
> + {
> +-  if (tagp[0] != '\0')
> +-    {
> +-      char buf[6 + strlen (tagp)];
> +-      sprintf (buf, "NAN(%s)", tagp);
> +-      return strtold (buf, NULL);
> +-    }
> +-
> +-  return NAN;
> ++  return __strtold_nan (tagp, NULL, 0);
> + }
> + weak_alias (__nanl, nanl)
> +Index: git/math/test-nan-overflow.c
> +===================================================================
> +--- /dev/null
> ++++ git/math/test-nan-overflow.c
> +@@ -0,0 +1,66 @@
> ++/* Test nan functions stack overflow (bug 16962).
> ++   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>
> ++#include <stdio.h>
> ++#include <string.h>
> ++#include <sys/resource.h>
> ++
> ++#define STACK_LIM 1048576
> ++#define STRING_SIZE (2 * STACK_LIM)
> ++
> ++static int
> ++do_test (void)
> ++{
> ++  int result = 0;
> ++  struct rlimit lim;
> ++  getrlimit (RLIMIT_STACK, &lim);
> ++  lim.rlim_cur = STACK_LIM;
> ++  setrlimit (RLIMIT_STACK, &lim);
> ++  char *nanstr = malloc (STRING_SIZE);
> ++  if (nanstr == NULL)
> ++    {
> ++      puts ("malloc failed, cannot test");
> ++      return 77;
> ++    }
> ++  memset (nanstr, '0', STRING_SIZE - 1);
> ++  nanstr[STRING_SIZE - 1] = 0;
> ++#define NAN_TEST(TYPE, FUNC)                        \
> ++  do                                                \
> ++    {                                               \
> ++      char *volatile p = nanstr;            \
> ++      volatile TYPE v = FUNC (p);           \
> ++      if (isnan (v))                                \
> ++    puts ("PASS: " #FUNC);                  \
> ++      else                                  \
> ++    {                                       \
> ++      puts ("FAIL: " #FUNC);                \
> ++      result = 1;                           \
> ++    }                                       \
> ++    }                                               \
> ++  while (0)
> ++  NAN_TEST (float, nanf);
> ++  NAN_TEST (double, nan);
> ++#ifndef NO_LONG_DOUBLE
> ++  NAN_TEST (long double, nanl);
> ++#endif
> ++  return result;
> ++}
> ++
> ++#define TEST_FUNCTION do_test ()
> ++#include "../test-skeleton.c"
> +Index: git/math/test-nan-payload.c
> +===================================================================
> +--- /dev/null
> ++++ git/math/test-nan-payload.c
> +@@ -0,0 +1,122 @@
> ++/* Test nan functions payload handling (bug 16961).
> ++   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 <float.h>
> ++#include <math.h>
> ++#include <stdio.h>
> ++#include <stdlib.h>
> ++#include <string.h>
> ++
> ++/* Avoid built-in functions.  */
> ++#define WRAP_NAN(FUNC, STR) \
> ++  ({ const char *volatile wns = (STR); FUNC (wns); })
> ++#define WRAP_STRTO(FUNC, STR) \
> ++  ({ const char *volatile wss = (STR); FUNC (wss, NULL); })
> ++
> ++#define CHECK_IS_NAN(TYPE, A)                       \
> ++  do                                                \
> ++    {                                               \
> ++      if (isnan (A))                                \
> ++    puts ("PASS: " #TYPE " " #A);           \
> ++      else                                  \
> ++    {                                       \
> ++      puts ("FAIL: " #TYPE " " #A);         \
> ++      result = 1;                           \
> ++    }                                       \
> ++    }                                               \
> ++  while (0)
> ++
> ++#define CHECK_SAME_NAN(TYPE, A, B)                  \
> ++  do                                                        \
> ++    {                                                       \
> ++      if (memcmp (&(A), &(B), sizeof (A)) == 0)             \
> ++    puts ("PASS: " #TYPE " " #A " = " #B);          \
> ++      else                                          \
> ++    {                                               \
> ++      puts ("FAIL: " #TYPE " " #A " = " #B);        \
> ++      result = 1;                                   \
> ++    }                                               \
> ++    }                                                       \
> ++  while (0)
> ++
> ++#define CHECK_DIFF_NAN(TYPE, A, B)                  \
> ++  do                                                        \
> ++    {                                                       \
> ++      if (memcmp (&(A), &(B), sizeof (A)) != 0)             \
> ++    puts ("PASS: " #TYPE " " #A " != " #B);         \
> ++      else                                          \
> ++    {                                               \
> ++      puts ("FAIL: " #TYPE " " #A " != " #B);       \
> ++      result = 1;                                   \
> ++    }                                               \
> ++    }                                                       \
> ++  while (0)
> ++
> ++/* Cannot test payloads by memcmp for formats where NaNs have padding
> ++   bits.  */
> ++#define CAN_TEST_EQ(MANT_DIG) ((MANT_DIG) != 64 && (MANT_DIG) != 106)
> ++
> ++#define RUN_TESTS(TYPE, SFUNC, FUNC, MANT_DIG)              \
> ++  do                                                        \
> ++    {                                                       \
> ++     TYPE n123 = WRAP_NAN (FUNC, "123");            \
> ++     CHECK_IS_NAN (TYPE, n123);                             \
> ++     TYPE s123 = WRAP_STRTO (SFUNC, "NAN(123)");    \
> ++     CHECK_IS_NAN (TYPE, s123);                             \
> ++     TYPE n456 = WRAP_NAN (FUNC, "456");            \
> ++     CHECK_IS_NAN (TYPE, n456);                             \
> ++     TYPE s456 = WRAP_STRTO (SFUNC, "NAN(456)");    \
> ++     CHECK_IS_NAN (TYPE, s456);                             \
> ++     TYPE n123x = WRAP_NAN (FUNC, "123)");          \
> ++     CHECK_IS_NAN (TYPE, n123x);                    \
> ++     TYPE nemp = WRAP_NAN (FUNC, "");                       \
> ++     CHECK_IS_NAN (TYPE, nemp);                             \
> ++     TYPE semp = WRAP_STRTO (SFUNC, "NAN()");               \
> ++     CHECK_IS_NAN (TYPE, semp);                             \
> ++     TYPE sx = WRAP_STRTO (SFUNC, "NAN");           \
> ++     CHECK_IS_NAN (TYPE, sx);                               \
> ++     if (CAN_TEST_EQ (MANT_DIG))                    \
> ++       CHECK_SAME_NAN (TYPE, n123, s123);           \
> ++     if (CAN_TEST_EQ (MANT_DIG))                    \
> ++       CHECK_SAME_NAN (TYPE, n456, s456);           \
> ++     if (CAN_TEST_EQ (MANT_DIG))                    \
> ++       CHECK_SAME_NAN (TYPE, nemp, semp);           \
> ++     if (CAN_TEST_EQ (MANT_DIG))                    \
> ++       CHECK_SAME_NAN (TYPE, n123x, sx);            \
> ++     CHECK_DIFF_NAN (TYPE, n123, n456);                     \
> ++     CHECK_DIFF_NAN (TYPE, n123, nemp);                     \
> ++     CHECK_DIFF_NAN (TYPE, n123, n123x);            \
> ++     CHECK_DIFF_NAN (TYPE, n456, nemp);                     \
> ++     CHECK_DIFF_NAN (TYPE, n456, n123x);            \
> ++    }                                                       \
> ++  while (0)
> ++
> ++static int
> ++do_test (void)
> ++{
> ++  int result = 0;
> ++  RUN_TESTS (float, strtof, nanf, FLT_MANT_DIG);
> ++  RUN_TESTS (double, strtod, nan, DBL_MANT_DIG);
> ++#ifndef NO_LONG_DOUBLE
> ++  RUN_TESTS (long double, strtold, nanl, LDBL_MANT_DIG);
> ++#endif
> ++  return result;
> ++}
> ++
> ++#define TEST_FUNCTION do_test ()
> ++#include "../test-skeleton.c"
> +Index: git/stdlib/Versions
> +===================================================================
> +--- git.orig/stdlib/Versions
> ++++ git/stdlib/Versions
> +@@ -118,5 +118,6 @@ libc {
> +     # Used from other libraries
> +     __libc_secure_getenv;
> +     __call_tls_dtors;
> ++    __strtof_nan; __strtod_nan; __strtold_nan;
> +   }
> + }
> +Index: git/math/Makefile
> +===================================================================
> +--- git.orig/math/Makefile
> ++++ git/math/Makefile
> +@@ -92,7 +92,9 @@ tests = test-matherr test-fenv atest-exp
> +     test-misc test-fpucw test-fpucw-ieee tst-definitions test-tgmath \
> +     test-tgmath-ret bug-nextafter bug-nexttoward bug-tgmath1 \
> +     test-tgmath-int test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 test-snan \
> +-    test-fenv-tls test-fenv-preserve test-fenv-return $(tests-static)
> ++    test-fenv-tls test-fenv-preserve test-fenv-return \
> ++    test-nan-overflow test-nan-payload \
> ++    $(tests-static)
> + tests-static = test-fpucw-static test-fpucw-ieee-static
> + # We do the `long double' tests only if this data type is available and
> + # distinct from `double'.
> diff --git a/meta/recipes-core/glibc/glibc_2.20.bb 
> b/meta/recipes-core/glibc/glibc_2.20.bb
> index af568d9..d099d5d 100644
> --- a/meta/recipes-core/glibc/glibc_2.20.bb
> +++ b/meta/recipes-core/glibc/glibc_2.20.bb
> @@ -50,6 +50,8 @@ CVEPATCHES = "\
>          file://CVE-2015-7547.patch \
>          file://CVE-2015-8777.patch \
>          file://CVE-2015-8779.patch \
> +        file://CVE-2015-9761_1.patch \
> +        file://CVE-2015-9761_2.patch \
>  "
>  
>  LIC_FILES_CHKSUM = "file://LICENSES;md5=e9a558e243b36d3209f380deb394b213 \
> -- 
> 2.3.5
> 
> -- 
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core

-- 
Martin 'JaMa' Jansa     jabber: martin.ja...@gmail.com

Attachment: signature.asc
Description: Digital signature

-- 
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to