From 43a7345a5cf8cc60db33e2cc8f2c5856a6d2b0ea Mon Sep 17 00:00:00 2001 From: "Dmitry.Neverov" Date: Fri, 20 Sep 2024 10:20:03 +0200 Subject: [PATCH] [cidr debugger] CPP-40257 handle invalid codepoints during escape sequence decoding GitOrigin-RevId: 57063d148b5d840f17e08b664d70c949636b5b1b --- .../intellij/openapi/util/text/StringUtil.java | 15 ++++++++++----- .../com/intellij/util/text/StringUtilTest.java | 2 ++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java index 66c40dc87bda..87e8054e79dd 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -874,11 +874,16 @@ public class StringUtil { } if (sb.length() != 0) { try { - long code = Long.parseLong(sb.toString(), radix); - //noinspection AssignmentToForLoopParameter - idx += sb.length() + suffixLen - 1; - // todo: implement UTF-32 support - buffer.append((char)code); + int code = Integer.parseInt(sb.toString(), radix); + if (Character.isValidCodePoint(code)) { + //noinspection AssignmentToForLoopParameter + idx += sb.length() + suffixLen - 1; + // todo: implement UTF-32 support + buffer.append(Character.toChars(code)); + } + else { + buffer.append('\\').append(ch); + } } catch (NumberFormatException e) { buffer.append('\\').append(ch); diff --git a/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java b/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java index 6a0559bb36a1..ba827893ffa7 100644 --- a/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java +++ b/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java @@ -1077,11 +1077,13 @@ public class StringUtilTest { assertEquals("" + (char)0xfff, StringUtil.unescapeAnsiStringCharacters("\\xfff")); assertEquals("" + (char)0xffff, StringUtil.unescapeAnsiStringCharacters("\\xffff")); assertEquals("" + (char)0xf, StringUtil.unescapeAnsiStringCharacters("\\x0000000000000000f")); + assertEquals("\\x110000", StringUtil.unescapeAnsiStringCharacters("\\x110000")); // invalid unicode codepoint // 4 digit codepoint assertEquals("\u1234", StringUtil.unescapeAnsiStringCharacters("\\u1234")); // 8 digit codepoint assertEquals("\u0061", StringUtil.unescapeAnsiStringCharacters("\\U00000061")); + assertEquals("\\U00110000", StringUtil.unescapeAnsiStringCharacters("\\U00110000")); // invalid unicode codepoint } }