]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
json: fix null-termination of json::string
authorDavid Malcolm <dmalcolm@redhat.com>
Fri, 11 Jul 2025 18:58:20 +0000 (14:58 -0400)
committerDavid Malcolm <dmalcolm@redhat.com>
Fri, 11 Jul 2025 18:58:20 +0000 (14:58 -0400)
gcc/ChangeLog:
* json.cc (string::string): When constructing from pointer and
length, ensure the new buffer is null-terminated.
(selftest::test_strcmp): New.
(selftest::json_cc_tests): Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
gcc/json.cc

index f3f364598569ae9fcfdcf4c6e1ffb2181e169f6f..df0702f8e6c5786265a5ac3e92b877133c12c27c 100644 (file)
@@ -501,9 +501,10 @@ string::string (const char *utf8)
 string::string (const char *utf8, size_t len)
 {
   gcc_assert (utf8);
-  m_utf8 = XNEWVEC (char, len);
+  m_utf8 = XNEWVEC (char, len + 1);
   m_len = len;
   memcpy (m_utf8, utf8, len);
+  m_utf8[len] = '\0';
 }
 
 /* Implementation of json::value::print for json::string.  */
@@ -914,6 +915,15 @@ test_comparisons ()
   ASSERT_JSON_NE (arr_1, arr_2);
 }
 
+/* Ensure that json::string's get_string is usable as a C-style string.  */
+
+static void
+test_strcmp ()
+{
+  string str ("foobar", 3);
+  ASSERT_EQ (strcmp (str.get_string (), "foo"), 0);
+}
+
 /* Run all of the selftests within this file.  */
 
 void
@@ -928,6 +938,7 @@ json_cc_tests ()
   test_writing_literals ();
   test_formatting ();
   test_comparisons ();
+  test_strcmp ();
 }
 
 } // namespace selftest