Skip to content

Commit b472243

Browse files
committed
Merge branch '2.15' into 2.16
2 parents 9a42a67 + 0066b88 commit b472243

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

release-notes/VERSION-2.x

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,9 @@ JSON library.
6969
#990: Backport removal of BigDecimal to BigInt conversion (#987)
7070
(contributed by @pjfanning)
7171
#1004: FastDoubleParser license
72+
#1012: Got `NegativeArraySizeException` when calling `writeValueAsString()`
73+
(reported by @klettier)
74+
(fix contributed by @pjfanning)
7275

7376
2.14.2 (28-Jan-2023)
7477

src/main/java/com/fasterxml/jackson/core/util/TextBuffer.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,13 @@ public String contentsAsString() throws IOException
479479
_resultString = new String(_currentSegment, 0, currLen);
480480
}
481481
} else { // no, need to combine
482-
validateStringLength(segLen + currLen);
483-
StringBuilder sb = new StringBuilder(segLen + currLen);
482+
final int builderLen = segLen + currLen;
483+
if (builderLen < 0) {
484+
_reportBufferOverflow(segLen, currLen);
485+
}
486+
validateStringLength(builderLen);
487+
StringBuilder sb = new StringBuilder(builderLen);
488+
484489
// First stored segments
485490
if (_segments != null) {
486491
for (int i = 0, len = _segments.size(); i < len; ++i) {
@@ -927,6 +932,9 @@ public char[] finishCurrentSegment() throws IOException {
927932
_segments.add(_currentSegment);
928933
int oldLen = _currentSegment.length;
929934
_segmentSize += oldLen;
935+
if (_segmentSize < 0) {
936+
_reportBufferOverflow(_segmentSize - oldLen, oldLen);
937+
}
930938
_currentSize = 0;
931939
validateStringLength(_segmentSize);
932940

@@ -1087,6 +1095,9 @@ private void expand()
10871095
_hasSegments = true;
10881096
_segments.add(curr);
10891097
_segmentSize += curr.length;
1098+
if (_segmentSize < 0) {
1099+
_reportBufferOverflow(_segmentSize - curr.length, curr.length);
1100+
}
10901101
_currentSize = 0;
10911102
int oldLen = curr.length;
10921103

@@ -1121,6 +1132,9 @@ private char[] resultArray() throws IOException
11211132
// nope, not shared
11221133
int size = size();
11231134
if (size < 1) {
1135+
if (size < 0) {
1136+
_reportBufferOverflow(_segmentSize, _currentSize);
1137+
}
11241138
return NO_CHARS;
11251139
}
11261140
validateStringLength(size);
@@ -1146,6 +1160,12 @@ private char[] resultArray() throws IOException
11461160
/**********************************************************************
11471161
*/
11481162

1163+
protected void _reportBufferOverflow(int prev, int curr) {
1164+
long newSize = (long) prev + (long) curr;
1165+
throw new IllegalStateException("TextBuffer overrun: size reached ("
1166+
+newSize+") exceeds maximum of "+Integer.MAX_VALUE);
1167+
}
1168+
11491169
/**
11501170
* Convenience method that can be used to verify that a String
11511171
* of specified length does not exceed maximum specific by this

0 commit comments

Comments
 (0)