From 574e417460cdfebb8157fbe61b6a015e44856f64 Mon Sep 17 00:00:00 2001 From: Sergei Barannikov Date: Wed, 15 Feb 2023 17:04:37 +0300 Subject: [PATCH] [clang] Fix a bug that allowed some overflowing octal escape sequences Reviewed By: cor3ntin Differential Revision: https://reviews.llvm.org/D144100 --- clang/lib/Lex/LiteralSupport.cpp | 3 ++- clang/test/Lexer/char-escapes-delimited.c | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/clang/lib/Lex/LiteralSupport.cpp b/clang/lib/Lex/LiteralSupport.cpp index 421a853..38b68bd 100644 --- a/clang/lib/Lex/LiteralSupport.cpp +++ b/clang/lib/Lex/LiteralSupport.cpp @@ -263,7 +263,8 @@ static unsigned ProcessCharEscape(const char *ThisTokBegin, ThisTokBuf++; continue; } - if (ResultChar & 0x020000000) + // Check if one of the top three bits is set before shifting them out. + if (ResultChar & 0xE0000000) Overflow = true; ResultChar <<= 3; diff --git a/clang/test/Lexer/char-escapes-delimited.c b/clang/test/Lexer/char-escapes-delimited.c index 8e7094b..3b1deff 100644 --- a/clang/test/Lexer/char-escapes-delimited.c +++ b/clang/test/Lexer/char-escapes-delimited.c @@ -58,6 +58,8 @@ void octal(void) { #if __WCHAR_MAX__ > 0xFFFF unsigned d = L'\o{37777777777}'; // ext-warning {{extension}} cxx2b-warning {{C++2b}} unsigned e = L'\o{40000000000}'; // expected-error {{octal escape sequence out of range}} + unsigned f = L'\o{100000000000}'; // expected-error {{octal escape sequence out of range}} + unsigned g = L'\o{200000000000}'; // expected-error {{octal escape sequence out of range}} #else unsigned d = L'\o{177777}'; // ext-warning {{extension}} cxx2b-warning {{C++2b}} unsigned e = L'\o{200000}'; // expected-error {{octal escape sequence out of range}} -- 2.7.4