From 937a778ea37e129a758c44a3868d3842e5cd62ab Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Sat, 14 Dec 2019 23:18:53 +0100
Subject: [PATCH] re PR preprocessor/92919 (invalid memory access in
 wide_str_to_charconst when running ucn2.C testcase (caught by hwasan))

	PR preprocessor/92919
	* charset.c (wide_str_to_charconst): If str contains just the
	NUL terminator, punt quietly.

From-SVN: r279399
---
 libcpp/ChangeLog |  6 ++++++
 libcpp/charset.c | 11 +++++++++++
 2 files changed, 17 insertions(+)

diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog
index 2090bd72103c..69b1c0c49403 100644
--- a/libcpp/ChangeLog
+++ b/libcpp/ChangeLog
@@ -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.
diff --git a/libcpp/charset.c b/libcpp/charset.c
index 956d2dad5c86..a638a1b98fa0 100644
--- a/libcpp/charset.c
+++ b/libcpp/charset.c
@@ -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.  */
-- 
GitLab