From 937a778ea37e129a758c44a3868d3842e5cd62ab Mon Sep 17 00:00:00 2001 From: Jakub Jelinek 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 2090bd72103..69b1c0c4940 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,9 @@ +2019-12-14 Jakub Jelinek + + PR preprocessor/92919 + * charset.c (wide_str_to_charconst): If str contains just the + NUL terminator, punt quietly. + 2019-12-09 David Malcolm * include/line-map.h (label_text::label_text): Make private. diff --git a/libcpp/charset.c b/libcpp/charset.c index 956d2dad5c8..a638a1b98fa 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. */ -- 2.30.2