Skip to content

Commit ae85262

Browse files
committed
[LANG-1828] Fix OOM in StringUtils.leftPad/rightPad when size is
Integer.MIN_VALUE (#1736).
1 parent 170e9f2 commit ae85262

3 files changed

Lines changed: 15 additions & 8 deletions

File tree

src/changes/changes.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ java.lang.NullPointerException: Cannot invoke
213213
<action type="fix" dev="ggregory" due-to="alhudz, Gary Gregory">Keep StrBuilder.reverse from splitting surrogate pairs (#1730).</action>
214214
<action type="fix" dev="ggregory" due-to="alhudz, Gary Gregory">Fix NumberUtils min/max varargs dropping the sign of zero (#1733).</action>
215215
<action type="fix" dev="ggregory" due-to="alhudz, Gary Gregory">Handle supplementary code points in StringUtils.splitByCharacterType() (#1734).</action>
216+
<action issue="LANG-1828" type="fix" dev="ggregory" due-to="Dhruv Aggarwal, Gary Gregory">Fix OOM in StringUtils.leftPad/rightPad when size is Integer.MIN_VALUE (#1736).</action>
216217
<!-- ADD -->
217218
<action type="add" dev="ggregory" due-to="Gary Gregory">Add JavaVersion.JAVA_27.</action>
218219
<action type="add" dev="ggregory" due-to="Gary Gregory">Add SystemUtils.IS_JAVA_27.</action>

src/main/java/org/apache/commons/lang3/StringUtils.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5194,8 +5194,8 @@ public static String leftPad(final String str, final int size) {
51945194
* @since 2.0
51955195
*/
51965196
public static String leftPad(final String str, final int size, final char padChar) {
5197-
if (str == null) {
5198-
return null;
5197+
if (str == null || size <= str.length()) {
5198+
return str;
51995199
}
52005200
final int pads = size - str.length();
52015201
if (pads <= 0) {
@@ -5232,8 +5232,8 @@ public static String leftPad(final String str, final int size, final char padCha
52325232
* @return left padded String or original String if no padding is necessary, {@code null} if null String input.
52335233
*/
52345234
public static String leftPad(final String str, final int size, String padStr) {
5235-
if (str == null) {
5236-
return null;
5235+
if (str == null || size <= str.length()) {
5236+
return str;
52375237
}
52385238
if (isEmpty(padStr)) {
52395239
padStr = SPACE;
@@ -6988,8 +6988,8 @@ public static String rightPad(final String str, final int size) {
69886988
* @since 2.0
69896989
*/
69906990
public static String rightPad(final String str, final int size, final char padChar) {
6991-
if (str == null) {
6992-
return null;
6991+
if (str == null || size <= str.length()) {
6992+
return str;
69936993
}
69946994
final int pads = size - str.length();
69956995
if (pads <= 0) {
@@ -7026,8 +7026,8 @@ public static String rightPad(final String str, final int size, final char padCh
70267026
* @return right padded String or original String if no padding is necessary, {@code null} if null String input.
70277027
*/
70287028
public static String rightPad(final String str, final int size, String padStr) {
7029-
if (str == null) {
7030-
return null;
7029+
if (str == null || size <= str.length()) {
7030+
return str;
70317031
}
70327032
if (isEmpty(padStr)) {
70337033
padStr = SPACE;

src/test/java/org/apache/commons/lang3/StringUtilsTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,6 +1323,7 @@ void testLeftPad_StringInt() {
13231323
assertEquals(" ", StringUtils.leftPad("", 5));
13241324
assertEquals(" abc", StringUtils.leftPad("abc", 5));
13251325
assertEquals("abc", StringUtils.leftPad("abc", 2));
1326+
assertEquals("abc", StringUtils.leftPad("abc", Integer.MIN_VALUE));
13261327
}
13271328

13281329
@Test
@@ -1333,6 +1334,7 @@ void testLeftPad_StringIntChar() {
13331334
assertEquals("xxabc", StringUtils.leftPad("abc", 5, 'x'));
13341335
assertEquals("\uffff\uffffabc", StringUtils.leftPad("abc", 5, '\uffff'));
13351336
assertEquals("abc", StringUtils.leftPad("abc", 2, ' '));
1337+
assertEquals("abc", StringUtils.leftPad("abc", Integer.MIN_VALUE, ' '));
13361338
final String str = StringUtils.leftPad("aaa", 10000, 'a'); // bigger than pad length
13371339
assertEquals(10000, str.length());
13381340
assertTrue(StringUtils.containsOnly(str, 'a'));
@@ -1350,6 +1352,7 @@ void testLeftPad_StringIntString() {
13501352
assertEquals("abc", StringUtils.leftPad("abc", -1, " "));
13511353
assertEquals(" abc", StringUtils.leftPad("abc", 5, null));
13521354
assertEquals(" abc", StringUtils.leftPad("abc", 5, ""));
1355+
assertEquals("abc", StringUtils.leftPad("abc", Integer.MIN_VALUE, " "));
13531356
}
13541357

13551358
@Test
@@ -2202,6 +2205,7 @@ void testRightPad_StringInt() {
22022205
assertEquals("abc ", StringUtils.rightPad("abc", 5));
22032206
assertEquals("abc", StringUtils.rightPad("abc", 2));
22042207
assertEquals("abc", StringUtils.rightPad("abc", -1));
2208+
assertEquals("abc", StringUtils.rightPad("abc", Integer.MIN_VALUE));
22052209
}
22062210

22072211
@Test
@@ -2212,6 +2216,7 @@ void testRightPad_StringIntChar() {
22122216
assertEquals("abc", StringUtils.rightPad("abc", 2, ' '));
22132217
assertEquals("abc", StringUtils.rightPad("abc", -1, ' '));
22142218
assertEquals("abcxx", StringUtils.rightPad("abc", 5, 'x'));
2219+
assertEquals("abc", StringUtils.rightPad("abc", Integer.MIN_VALUE, ' '));
22152220
final String str = StringUtils.rightPad("aaa", 10000, 'a'); // bigger than pad length
22162221
assertEquals(10000, str.length());
22172222
assertTrue(StringUtils.containsOnly(str, 'a'));
@@ -2229,6 +2234,7 @@ void testRightPad_StringIntString() {
22292234
assertEquals("abc", StringUtils.rightPad("abc", -1, " "));
22302235
assertEquals("abc ", StringUtils.rightPad("abc", 5, null));
22312236
assertEquals("abc ", StringUtils.rightPad("abc", 5, ""));
2237+
assertEquals("abc", StringUtils.rightPad("abc", Integer.MIN_VALUE, " "));
22322238
}
22332239

22342240
@Test

0 commit comments

Comments
 (0)