修复StrSplitter.splitByRegex使用空参数导致的OOM问题

This commit is contained in:
Looly 2023-12-12 04:29:20 +08:00
parent 4ab74605be
commit 32f2d0bd55
3 changed files with 40 additions and 16 deletions

View File

@ -2,7 +2,7 @@
# 🚀Changelog # 🚀Changelog
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.24(2023-12-11) # 5.8.24(2023-12-12)
### 🐣新特性 ### 🐣新特性
* 【cache 】 Cache增加get重载可自定义超时时间issue#I8G0DL@Gitee * 【cache 】 Cache增加get重载可自定义超时时间issue#I8G0DL@Gitee
@ -18,6 +18,7 @@
* 【extra 】 修复Archiver 最后一个 Entry 为空文件夹时未关闭 Entry问题pr#1123@Gitee * 【extra 】 修复Archiver 最后一个 Entry 为空文件夹时未关闭 Entry问题pr#1123@Gitee
* 【core 】 修复ImgUtil.convert png转jpg在jdk9+中失败问题issue#I8L8UA@Gitee * 【core 】 修复ImgUtil.convert png转jpg在jdk9+中失败问题issue#I8L8UA@Gitee
* 【cache 】 修复StampedCache的get方法非原子问题issue#I8MEIX@Gitee * 【cache 】 修复StampedCache的get方法非原子问题issue#I8MEIX@Gitee
* 【core 】 修复StrSplitter.splitByRegex使用空参数导致的OOM问题issue#3421@Github
------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------
# 5.8.23(2023-11-12) # 5.8.23(2023-11-12)

View File

@ -49,9 +49,16 @@ public class PatternFinder extends TextFinder {
@Override @Override
public int start(int from) { public int start(int from) {
if (matcher.find(from)) { if (matcher.find(from)) {
final int end = matcher.end();
// 只有匹配到的字符串结尾在limit范围内才算找到 // 只有匹配到的字符串结尾在limit范围内才算找到
if(matcher.end() <= getValidEndIndex()){ if(end <= getValidEndIndex()){
return matcher.start(); final int start = matcher.start();
if(start == end){
// issue#3421如果匹配空串按照未匹配对待避免死循环
return INDEX_NOT_FOUND;
}
return start;
} }
} }
return INDEX_NOT_FOUND; return INDEX_NOT_FOUND;

View File

@ -1,5 +1,6 @@
package cn.hutool.core.text.split; package cn.hutool.core.text.split;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.text.StrSplitter; import cn.hutool.core.text.StrSplitter;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
@ -15,8 +16,8 @@ public class StrSplitterTest {
@Test @Test
public void splitByCharTest(){ public void splitByCharTest(){
String str1 = "a, ,efedsfs, ddf"; final String str1 = "a, ,efedsfs, ddf";
List<String> split = StrSplitter.split(str1, ',', 0, true, true); final List<String> split = StrSplitter.split(str1, ',', 0, true, true);
Assert.assertEquals("ddf", split.get(2)); Assert.assertEquals("ddf", split.get(2));
Assert.assertEquals(3, split.size()); Assert.assertEquals(3, split.size());
@ -24,32 +25,32 @@ public class StrSplitterTest {
@Test @Test
public void splitByStrTest(){ public void splitByStrTest(){
String str1 = "aabbccaaddaaee"; final String str1 = "aabbccaaddaaee";
List<String> split = StrSplitter.split(str1, "aa", 0, true, true); final List<String> split = StrSplitter.split(str1, "aa", 0, true, true);
Assert.assertEquals("ee", split.get(2)); Assert.assertEquals("ee", split.get(2));
Assert.assertEquals(3, split.size()); Assert.assertEquals(3, split.size());
} }
@Test @Test
public void splitByBlankTest(){ public void splitByBlankTest(){
String str1 = "aa bbccaa ddaaee"; final String str1 = "aa bbccaa ddaaee";
List<String> split = StrSplitter.split(str1, 0); final List<String> split = StrSplitter.split(str1, 0);
Assert.assertEquals("ddaaee", split.get(2)); Assert.assertEquals("ddaaee", split.get(2));
Assert.assertEquals(3, split.size()); Assert.assertEquals(3, split.size());
} }
@Test @Test
public void splitPathTest(){ public void splitPathTest(){
String str1 = "/use/local/bin"; final String str1 = "/use/local/bin";
List<String> split = StrSplitter.splitPath(str1, 0); final List<String> split = StrSplitter.splitPath(str1, 0);
Assert.assertEquals("bin", split.get(2)); Assert.assertEquals("bin", split.get(2));
Assert.assertEquals(3, split.size()); Assert.assertEquals(3, split.size());
} }
@Test @Test
public void splitMappingTest() { public void splitMappingTest() {
String str = "1.2."; final String str = "1.2.";
List<Long> split = StrSplitter.split(str, '.', 0, true, true, Long::parseLong); final List<Long> split = StrSplitter.split(str, '.', 0, true, true, Long::parseLong);
Assert.assertEquals(2, split.size()); Assert.assertEquals(2, split.size());
Assert.assertEquals(Long.valueOf(1L), split.get(0)); Assert.assertEquals(Long.valueOf(1L), split.get(0));
Assert.assertEquals(Long.valueOf(2L), split.get(1)); Assert.assertEquals(Long.valueOf(2L), split.get(1));
@ -57,7 +58,7 @@ public class StrSplitterTest {
@Test @Test
public void splitEmptyTest(){ public void splitEmptyTest(){
String str = ""; final String str = "";
final String[] split = str.split(","); final String[] split = str.split(",");
final String[] strings = StrSplitter.splitToArray(str, ",", -1, false, false); final String[] strings = StrSplitter.splitToArray(str, ",", -1, false, false);
Assert.assertNotNull(strings); Assert.assertNotNull(strings);
@ -66,7 +67,7 @@ public class StrSplitterTest {
@Test @Test
public void splitNullTest(){ public void splitNullTest(){
String str = null; final String str = null;
final String[] strings = StrSplitter.splitToArray(str, ",", -1, false, false); final String[] strings = StrSplitter.splitToArray(str, ",", -1, false, false);
Assert.assertNotNull(strings); Assert.assertNotNull(strings);
Assert.assertEquals(0, strings.length); Assert.assertEquals(0, strings.length);
@ -77,7 +78,7 @@ public class StrSplitterTest {
*/ */
@Test @Test
public void splitByRegexTest(){ public void splitByRegexTest(){
String text = "01 821 34567890182345617821"; final String text = "01 821 34567890182345617821";
List<String> strings = StrSplitter.splitByRegex(text, "21", 0, false, true); List<String> strings = StrSplitter.splitByRegex(text, "21", 0, false, true);
Assert.assertEquals(2, strings.size()); Assert.assertEquals(2, strings.size());
Assert.assertEquals("01 8", strings.get(0)); Assert.assertEquals("01 8", strings.get(0));
@ -89,4 +90,19 @@ public class StrSplitterTest {
Assert.assertEquals(" 345678901823456178", strings.get(1)); Assert.assertEquals(" 345678901823456178", strings.get(1));
Assert.assertEquals("", strings.get(2)); Assert.assertEquals("", strings.get(2));
} }
@Test
public void issue3421Test() {
List<String> strings = StrSplitter.splitByRegex("", "", 0, false, false);
Assert.assertEquals(ListUtil.of(""), strings);
strings = StrSplitter.splitByRegex("aaa", "", 0, false, false);
Assert.assertEquals(ListUtil.of("aaa"), strings);
strings = StrSplitter.splitByRegex("", "aaa", 0, false, false);
Assert.assertEquals(ListUtil.of(""), strings);
strings = StrSplitter.splitByRegex("", "", 0, false, true);
Assert.assertEquals(ListUtil.of(), strings);
}
} }