@@ -479,8 +479,13 @@ public String contentsAsString() throws IOException
479
479
_resultString = new String (_currentSegment , 0 , currLen );
480
480
}
481
481
} 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
+
484
489
// First stored segments
485
490
if (_segments != null ) {
486
491
for (int i = 0 , len = _segments .size (); i < len ; ++i ) {
@@ -927,6 +932,9 @@ public char[] finishCurrentSegment() throws IOException {
927
932
_segments .add (_currentSegment );
928
933
int oldLen = _currentSegment .length ;
929
934
_segmentSize += oldLen ;
935
+ if (_segmentSize < 0 ) {
936
+ _reportBufferOverflow (_segmentSize - oldLen , oldLen );
937
+ }
930
938
_currentSize = 0 ;
931
939
validateStringLength (_segmentSize );
932
940
@@ -1087,6 +1095,9 @@ private void expand()
1087
1095
_hasSegments = true ;
1088
1096
_segments .add (curr );
1089
1097
_segmentSize += curr .length ;
1098
+ if (_segmentSize < 0 ) {
1099
+ _reportBufferOverflow (_segmentSize - curr .length , curr .length );
1100
+ }
1090
1101
_currentSize = 0 ;
1091
1102
int oldLen = curr .length ;
1092
1103
@@ -1121,6 +1132,9 @@ private char[] resultArray() throws IOException
1121
1132
// nope, not shared
1122
1133
int size = size ();
1123
1134
if (size < 1 ) {
1135
+ if (size < 0 ) {
1136
+ _reportBufferOverflow (_segmentSize , _currentSize );
1137
+ }
1124
1138
return NO_CHARS ;
1125
1139
}
1126
1140
validateStringLength (size );
@@ -1146,6 +1160,12 @@ private char[] resultArray() throws IOException
1146
1160
/**********************************************************************
1147
1161
*/
1148
1162
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
+
1149
1169
/**
1150
1170
* Convenience method that can be used to verify that a String
1151
1171
* of specified length does not exceed maximum specific by this
0 commit comments