svn commit: r318031 - stable/10/contrib/libc++/include

Dimitry Andric dim at FreeBSD.org
Tue May 9 16:58:10 UTC 2017


Author: dim
Date: Tue May  9 16:58:08 2017
New Revision: 318031
URL: https://svnweb.freebsd.org/changeset/base/318031

Log:
  MFC r317888 and two upstream prerequisites:
  
  Pull in r227097 from upstream libc++ trunk (by Marshall Clow):
  
    Fix PR21428. Buffer was one byte too small in octal formatting case.
    Add test
  
  Pull in r268009 from upstream libc++ trunk (by Eric Fiselier):
  
    Fix PR21428 for long. Buffer was one byte too small in octal
    formatting case. Rename previously added test
  
  Pull in r302362 from upstream libc++ trunk (by me):
  
    Ensure showbase does not overflow do_put buffers
  
    Summary:
    In https://bugs.freebsd.org/207918, Daniel McRobb describes how using
    std::showbase with ostreams can cause truncation of unsigned long long
    when output format is octal.  In fact, this can even happen with
    unsigned int and unsigned long.
  
    To ensure this does not happen, add one additional character to the
    do_put buffers if std::showbase is on.  Also add a test case.
  
    Reviewers: EricWF, mclow.lists
  
    Reviewed By: EricWF
  
    Subscribers: cfe-commits, emaste
  
    Differential Revision: https://reviews.llvm.org/D32670
  
  PR:		207918

Modified:
  stable/10/contrib/libc++/include/locale
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/contrib/libc++/include/locale
==============================================================================
--- stable/10/contrib/libc++/include/locale	Tue May  9 16:29:06 2017	(r318030)
+++ stable/10/contrib/libc++/include/locale	Tue May  9 16:58:08 2017	(r318031)
@@ -1555,7 +1555,8 @@ num_put<_CharT, _OutputIterator>::do_put
     this->__format_int(__fmt+1, __len, true, __iob.flags());
     const unsigned __nbuf = (numeric_limits<long>::digits / 3)
                           + ((numeric_limits<long>::digits % 3) != 0)
-                          + 1;
+                          + ((__iob.flags() & ios_base::showbase) != 0)
+                          + 2;
     char __nar[__nbuf];
 #ifdef _LIBCPP_LOCALE__L_EXTENSIONS
     int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
@@ -1585,7 +1586,8 @@ num_put<_CharT, _OutputIterator>::do_put
     this->__format_int(__fmt+1, __len, true, __iob.flags());
     const unsigned __nbuf = (numeric_limits<long long>::digits / 3)
                           + ((numeric_limits<long long>::digits % 3) != 0)
-                          + 1;
+                          + ((__iob.flags() & ios_base::showbase) != 0)
+                          + 2;
     char __nar[__nbuf];
 #ifdef _LIBCPP_LOCALE__L_EXTENSIONS
     int __nc = snprintf_l(__nar, sizeof(__nar), _LIBCPP_GET_C_LOCALE, __fmt, __v);
@@ -1615,6 +1617,7 @@ num_put<_CharT, _OutputIterator>::do_put
     this->__format_int(__fmt+1, __len, false, __iob.flags());
     const unsigned __nbuf = (numeric_limits<unsigned long>::digits / 3)
                           + ((numeric_limits<unsigned long>::digits % 3) != 0)
+                          + ((__iob.flags() & ios_base::showbase) != 0)
                           + 1;
     char __nar[__nbuf];
 #ifdef _LIBCPP_LOCALE__L_EXTENSIONS
@@ -1645,6 +1648,7 @@ num_put<_CharT, _OutputIterator>::do_put
     this->__format_int(__fmt+1, __len, false, __iob.flags());
     const unsigned __nbuf = (numeric_limits<unsigned long long>::digits / 3)
                           + ((numeric_limits<unsigned long long>::digits % 3) != 0)
+                          + ((__iob.flags() & ios_base::showbase) != 0)
                           + 1;
     char __nar[__nbuf];
 #ifdef _LIBCPP_LOCALE__L_EXTENSIONS


More information about the svn-src-all mailing list