8267529: StringJoiner can create a String that breaks String::equals

Reviewed-by: naoto
This commit is contained in:
Claes Redestad 2021-05-27 23:09:22 +00:00
parent 7f52c50ba3
commit 95b1fa7a88
2 changed files with 20 additions and 4 deletions

View file

@ -3239,8 +3239,12 @@ public final class String
*/
@ForceInline
static String join(String prefix, String suffix, String delimiter, String[] elements, int size) {
int icoder = prefix.coder() | suffix.coder() | delimiter.coder();
long len = (long) prefix.length() + suffix.length() + (long) Math.max(0, size - 1) * delimiter.length();
int icoder = prefix.coder() | suffix.coder();
long len = (long) prefix.length() + suffix.length();
if (size > 1) { // when there are more than one element, size - 1 delimiters will be emitted
len += (long) (size - 1) * delimiter.length();
icoder |= delimiter.coder();
}
// assert len > 0L; // max: (long) Integer.MAX_VALUE << 32
// following loop wil add max: (long) Integer.MAX_VALUE * Integer.MAX_VALUE to len
// so len can overflow at most once