re PR preprocessor/92919 (invalid memory access in wide_str_to_charconst when running...
authorJakub Jelinek <jakub@redhat.com>
Sat, 14 Dec 2019 22:18:53 +0000 (23:18 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 14 Dec 2019 22:18:53 +0000 (23:18 +0100)
PR preprocessor/92919
* charset.c (wide_str_to_charconst): If str contains just the
NUL terminator, punt quietly.

From-SVN: r279399

libcpp/ChangeLog
libcpp/charset.c

index 2090bd72103c16de6bc266130a9812bce0045063..69b1c0c4940374119f3feeb95cef202ac1f3af3d 100644 (file)
@@ -1,3 +1,9 @@
+2019-12-14  Jakub Jelinek  <jakub@redhat.com>
+
+       PR preprocessor/92919
+       * charset.c (wide_str_to_charconst): If str contains just the
+       NUL terminator, punt quietly.
+
 2019-12-09  David Malcolm  <dmalcolm@redhat.com>
 
        * include/line-map.h (label_text::label_text): Make private.
index 956d2dad5c86079bbd8644fb261dc167cfd64e11..a638a1b98fa0bf75a2b765ba18ca28d8e6dae76d 100644 (file)
@@ -1970,6 +1970,17 @@ wide_str_to_charconst (cpp_reader *pfile, cpp_string str,
   size_t off, i;
   cppchar_t result = 0, c;
 
+  if (str.len <= nbwc)
+    {
+      /* Error recovery, if no errors have been diagnosed previously,
+        there should be at least two wide characters.  Empty literals
+        are diagnosed earlier and we can get just the zero terminator
+        only if there were errors diagnosed during conversion.  */
+      *pchars_seen = 0;
+      *unsignedp = 0;
+      return 0;
+    }
+
   /* This is finicky because the string is in the target's byte order,
      which may not be our byte order.  Only the last character, ignoring
      the NUL terminator, is relevant.  */