From 1400bdc09a63ff7ddbe1d66c340cc8ad50da75c1 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Thu, 29 Oct 2015 20:43:32 +0300 Subject: [PATCH] Do not allow removeSurrounding remove overlapping prefix and suffix. --- libraries/stdlib/src/kotlin/text/Strings.kt | 4 ++-- libraries/stdlib/test/text/StringTest.kt | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/stdlib/src/kotlin/text/Strings.kt b/libraries/stdlib/src/kotlin/text/Strings.kt index 84f6171a0e8..2c1794d9444 100644 --- a/libraries/stdlib/src/kotlin/text/Strings.kt +++ b/libraries/stdlib/src/kotlin/text/Strings.kt @@ -534,7 +534,7 @@ public fun String.removeSuffix(suffix: CharSequence): String { * Otherwise returns a new char sequence with the same characters. */ public fun CharSequence.removeSurrounding(prefix: CharSequence, suffix: CharSequence): CharSequence { - if (startsWith(prefix) && endsWith(suffix)) { + if ((length >= prefix.length + suffix.length) && startsWith(prefix) && endsWith(suffix)) { return subSequence(prefix.length, length - suffix.length) } return subSequence(0, length) @@ -546,7 +546,7 @@ public fun CharSequence.removeSurrounding(prefix: CharSequence, suffix: CharSequ * Otherwise returns this string unchanged. */ public fun String.removeSurrounding(prefix: CharSequence, suffix: CharSequence): String { - if (startsWith(prefix) && endsWith(suffix)) { + if ((length >= prefix.length + suffix.length) && startsWith(prefix) && endsWith(suffix)) { return substring(prefix.length, length - suffix.length) } return this diff --git a/libraries/stdlib/test/text/StringTest.kt b/libraries/stdlib/test/text/StringTest.kt index 2c61cf5c2dd..ea72873484e 100644 --- a/libraries/stdlib/test/text/StringTest.kt +++ b/libraries/stdlib/test/text/StringTest.kt @@ -436,6 +436,8 @@ class StringTest { assertEquals("", "value>".removeSurrounding(pre, post), "Only removes surrounding when both prefix and suffix present") assertEquals("value", "value".removeSurrounding(pre, post)) + + assertEquals("<->", "<->".removeSurrounding(arg1("<-"), arg1("->")), "Does not remove overlapping prefix and suffix") } @test fun removePrefixCharSequence() = withTwoCharSequenceArgs { arg1, arg2 -> @@ -466,6 +468,8 @@ class StringTest { assertContentEquals(""), "Only removes surrounding when both prefix and suffix present") assertContentEquals("value>", "value>".removeSurrounding("<", ">"), "Only removes surrounding when both prefix and suffix present") assertContentEquals("value", "value".removeSurrounding("<", ">")) + + assertContentEquals("<->", "<->".removeSurrounding("<-", "->"), "Does not remove overlapping prefix and suffix") } /*