Skip to content

Commit c89d821

Browse files
retronymHao Xia
authored andcommitted
Fix SIOOBE in Name#pos for substrings of length 1
1 parent 827d69d commit c89d821

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

src/reflect/scala/reflect/internal/Names.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,11 +296,13 @@ trait Names extends api.Names {
296296
*/
297297
final def pos(s: String, start: Int): Int = {
298298
var i = pos(s.charAt(0), start)
299-
while (i + s.length() <= len) {
299+
val sLen = s.length()
300+
if (sLen == 1) return i
301+
while (i + sLen <= len) {
300302
var j = 1
301303
while (s.charAt(j) == chrs(index + i + j)) {
302304
j += 1
303-
if (j == s.length()) return i
305+
if (j == sLen) return i
304306
}
305307
i = pos(s.charAt(0), i + 1)
306308
}

test/junit/scala/reflect/internal/NamesTest.scala

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,29 @@ class NamesTest {
9292
assert(h1 string_== h2)
9393
assert(h1 string_== h1y)
9494
}
95+
96+
@Test
97+
def pos(): Unit = {
98+
def check(nameString: String, sub: String) = {
99+
val name = TermName(nameString)
100+
val javaResult = name.toString.indexOf(sub) match { case -1 => name.length case x => x }
101+
val nameResult = name.pos(sub)
102+
assertEquals(javaResult, nameResult)
103+
if (sub.length == 1) {
104+
val nameResultChar = name.pos(sub.head)
105+
assertEquals(javaResult, nameResultChar)
106+
}
107+
}
108+
109+
check("a", "a") // was "String index out of range: 1
110+
check("a", "b")
111+
check("a", "ab")
112+
check("a", "ba")
113+
check("ab", "a")
114+
check("ab", "b")
115+
check("ab", "ab")
116+
check("ab", "ba")
117+
check("", "x")
118+
check("", "xy")
119+
}
95120
}

0 commit comments

Comments
 (0)