public inbox for libstdc++-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-7697] libstdc++: Fix past-the-end increment in std::format [PR110862]
@ 2023-08-08 16:13 Jonathan Wakely
  0 siblings, 0 replies; only message in thread
From: Jonathan Wakely @ 2023-08-08 16:13 UTC (permalink / raw)
  To: gcc-cvs, libstdc++-cvs

https://gcc.gnu.org/g:55eb7e92a60adfae43aaf58bb9c81050d39d82c9

commit r13-7697-g55eb7e92a60adfae43aaf58bb9c81050d39d82c9
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Thu Aug 3 08:45:43 2023 +0100

    libstdc++: Fix past-the-end increment in std::format [PR110862]
    
    At the end of a replacement field we should check that the closing brace
    is actually present before incrementing past it.
    
    libstdc++-v3/ChangeLog:
    
            PR libstdc++/110862
            * include/std/format (_Scanner::_M_on_replacement_field):
            Check for expected '}' before incrementing iterator.
            * testsuite/std/format/string.cc: Check "{0:{0}" format string.
    
    (cherry picked from commit 5d87f71bb462ccb78dd3d9d810ea08d96869cb4b)

Diff:
---
 libstdc++-v3/include/std/format             |  4 +++-
 libstdc++-v3/testsuite/std/format/string.cc | 13 +++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index 0c6069b2681..ebf8bbaa15f 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -3533,7 +3533,9 @@ namespace __format
 	      _M_pc.advance_to(__ptr);
 	  }
 	_M_format_arg(__id);
-	_M_pc.advance_to(_M_pc.begin() + 1); // Move past '}'
+	if (begin() == end() || *begin() != '}')
+	  __format::__unmatched_left_brace_in_format_string();
+	_M_pc.advance_to(begin() + 1); // Move past '}'
       }
 
       constexpr virtual void _M_format_arg(size_t __id) = 0;
diff --git a/libstdc++-v3/testsuite/std/format/string.cc b/libstdc++-v3/testsuite/std/format/string.cc
index d28135ec260..6a45237b8c4 100644
--- a/libstdc++-v3/testsuite/std/format/string.cc
+++ b/libstdc++-v3/testsuite/std/format/string.cc
@@ -128,6 +128,19 @@ test_format_spec()
   VERIFY( ! is_format_string_for("{:9999999}", 1) );
 }
 
+void
+test_pr110862()
+{
+  try {
+    // PR libstdc++/110862 out-of-bounds read on invalid format string
+    (void) std::vformat("{0:{0}", std::make_format_args(1));
+    VERIFY( false );
+  } catch (const std::format_error& e) {
+    std::string_view what = e.what();
+    VERIFY( what.find("unmatched left brace") != what.npos );
+  }
+}
+
 int main()
 {
   test_no_args();

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-08-08 16:13 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-08 16:13 [gcc r13-7697] libstdc++: Fix past-the-end increment in std::format [PR110862] Jonathan Wakely

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).