From c4155aa62265cb152338da7e07b1f57203cd694f Mon Sep 17 00:00:00 2001 From: Daniil Ovchinnikov Date: Thu, 28 Jun 2018 17:21:46 +0300 Subject: [PATCH] fix SIOOBE in StringUtil#startsWith --- .../openapi/util/text/StringUtil.java | 1 + .../intellij/util/text/StringUtilTest.java | 34 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) 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 f9493ed6238d..83e74f2d1557 100644 --- a/platform/util/src/com/intellij/openapi/util/text/StringUtil.java +++ b/platform/util/src/com/intellij/openapi/util/text/StringUtil.java @@ -1835,6 +1835,7 @@ public class StringUtil extends StringUtilRt { @Contract(pure = true) public static boolean startsWith(@NotNull CharSequence text, int startIndex, @NotNull CharSequence prefix) { + if (startIndex < 0) return false; int l1 = text.length() - startIndex; int l2 = prefix.length(); if (l1 < l2) return false; diff --git a/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java b/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java index 84de2cb6ee4a..be5e58c3e2b1 100644 --- a/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java +++ b/platform/util/testSrc/com/intellij/util/text/StringUtilTest.java @@ -1,4 +1,4 @@ -// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.util.text; import com.intellij.openapi.util.Comparing; @@ -684,4 +684,36 @@ public class StringUtilTest { assertFalse(StringUtil.isShortNameOf("x.y.zzz", "zz")); assertFalse(StringUtil.isShortNameOf("x", "a.b.x")); } + + @Test + public void testStartsWith() { + assertTrue(StringUtil.startsWith("abcdefgh", 5, "fgh")); + assertTrue(StringUtil.startsWith("abcdefgh", 2, "cde")); + assertTrue(StringUtil.startsWith("abcdefgh", 0, "abc")); + assertTrue(StringUtil.startsWith("abcdefgh", 0, "abcdefgh")); + assertFalse(StringUtil.startsWith("abcdefgh", 5, "cde")); + + assertFalse(StringUtil.startsWith("abcdefgh", -100, "")); + assertFalse(StringUtil.startsWith("abcdefgh", -1, "")); + assertTrue(StringUtil.startsWith("abcdefgh", 0, "")); + assertTrue(StringUtil.startsWith("abcdefgh", 4, "")); + assertTrue(StringUtil.startsWith("abcdefgh", 7, "")); + assertTrue(StringUtil.startsWith("abcdefgh", 8, "")); + assertFalse(StringUtil.startsWith("abcdefgh", 9, "")); + assertFalse(StringUtil.startsWith("abcdefgh", 100, "")); + + assertFalse(StringUtil.startsWith("", -100, "")); + assertFalse(StringUtil.startsWith("", -1, "")); + assertTrue(StringUtil.startsWith("", 0, "")); + assertFalse(StringUtil.startsWith("", 1, "")); + assertFalse(StringUtil.startsWith("", 100, "")); + + assertFalse(StringUtil.startsWith("ab", -100, "abcdefgh")); + assertFalse(StringUtil.startsWith("ab", -1, "abcdefgh")); + assertFalse(StringUtil.startsWith("ab", 0, "abcdefgh")); + assertFalse(StringUtil.startsWith("ab", 1, "abcdefgh")); + assertFalse(StringUtil.startsWith("ab", 2, "abcdefgh")); + assertFalse(StringUtil.startsWith("ab", 3, "abcdefgh")); + assertFalse(StringUtil.startsWith("ab", 100, "abcdefgh")); + } }