diff --git a/CHANGELOG.md b/CHANGELOG.md index 0494af0b6..eb03c53cf 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.24(2023-12-11) +# 5.8.24(2023-12-12) ### 🐣新特性 * 【cache 】 Cache增加get重载,可自定义超时时间(issue#I8G0DL@Gitee) @@ -18,6 +18,7 @@ * 【extra 】 修复Archiver 最后一个 Entry 为空文件夹时未关闭 Entry问题(pr#1123@Gitee) * 【core 】 修复ImgUtil.convert png转jpg在jdk9+中失败问题(issue#I8L8UA@Gitee) * 【cache 】 修复StampedCache的get方法非原子问题(issue#I8MEIX@Gitee) +* 【core 】 修复StrSplitter.splitByRegex使用空参数导致的OOM问题(issue#3421@Github) ------------------------------------------------------------------------------------------------------------- # 5.8.23(2023-11-12) diff --git a/hutool-core/src/main/java/cn/hutool/core/text/finder/PatternFinder.java b/hutool-core/src/main/java/cn/hutool/core/text/finder/PatternFinder.java index c258daed0..397993086 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/finder/PatternFinder.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/finder/PatternFinder.java @@ -49,9 +49,16 @@ public class PatternFinder extends TextFinder { @Override public int start(int from) { if (matcher.find(from)) { + final int end = matcher.end(); // 只有匹配到的字符串结尾在limit范围内,才算找到 - if(matcher.end() <= getValidEndIndex()){ - return matcher.start(); + if(end <= getValidEndIndex()){ + final int start = matcher.start(); + if(start == end){ + // issue#3421,如果匹配空串,按照未匹配对待,避免死循环 + return INDEX_NOT_FOUND; + } + + return start; } } return INDEX_NOT_FOUND; diff --git a/hutool-core/src/test/java/cn/hutool/core/text/split/StrSplitterTest.java b/hutool-core/src/test/java/cn/hutool/core/text/split/StrSplitterTest.java index 16f812f69..8498bf479 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/split/StrSplitterTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/split/StrSplitterTest.java @@ -1,5 +1,6 @@ package cn.hutool.core.text.split; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.text.StrSplitter; import org.junit.Assert; import org.junit.Test; @@ -15,8 +16,8 @@ public class StrSplitterTest { @Test public void splitByCharTest(){ - String str1 = "a, ,efedsfs, ddf"; - List split = StrSplitter.split(str1, ',', 0, true, true); + final String str1 = "a, ,efedsfs, ddf"; + final List split = StrSplitter.split(str1, ',', 0, true, true); Assert.assertEquals("ddf", split.get(2)); Assert.assertEquals(3, split.size()); @@ -24,32 +25,32 @@ public class StrSplitterTest { @Test public void splitByStrTest(){ - String str1 = "aabbccaaddaaee"; - List split = StrSplitter.split(str1, "aa", 0, true, true); + final String str1 = "aabbccaaddaaee"; + final List split = StrSplitter.split(str1, "aa", 0, true, true); Assert.assertEquals("ee", split.get(2)); Assert.assertEquals(3, split.size()); } @Test public void splitByBlankTest(){ - String str1 = "aa bbccaa ddaaee"; - List split = StrSplitter.split(str1, 0); + final String str1 = "aa bbccaa ddaaee"; + final List split = StrSplitter.split(str1, 0); Assert.assertEquals("ddaaee", split.get(2)); Assert.assertEquals(3, split.size()); } @Test public void splitPathTest(){ - String str1 = "/use/local/bin"; - List split = StrSplitter.splitPath(str1, 0); + final String str1 = "/use/local/bin"; + final List split = StrSplitter.splitPath(str1, 0); Assert.assertEquals("bin", split.get(2)); Assert.assertEquals(3, split.size()); } @Test public void splitMappingTest() { - String str = "1.2."; - List split = StrSplitter.split(str, '.', 0, true, true, Long::parseLong); + final String str = "1.2."; + final List split = StrSplitter.split(str, '.', 0, true, true, Long::parseLong); Assert.assertEquals(2, split.size()); Assert.assertEquals(Long.valueOf(1L), split.get(0)); Assert.assertEquals(Long.valueOf(2L), split.get(1)); @@ -57,7 +58,7 @@ public class StrSplitterTest { @Test public void splitEmptyTest(){ - String str = ""; + final String str = ""; final String[] split = str.split(","); final String[] strings = StrSplitter.splitToArray(str, ",", -1, false, false); Assert.assertNotNull(strings); @@ -66,7 +67,7 @@ public class StrSplitterTest { @Test public void splitNullTest(){ - String str = null; + final String str = null; final String[] strings = StrSplitter.splitToArray(str, ",", -1, false, false); Assert.assertNotNull(strings); Assert.assertEquals(0, strings.length); @@ -77,7 +78,7 @@ public class StrSplitterTest { */ @Test public void splitByRegexTest(){ - String text = "01 821 34567890182345617821"; + final String text = "01 821 34567890182345617821"; List strings = StrSplitter.splitByRegex(text, "21", 0, false, true); Assert.assertEquals(2, strings.size()); Assert.assertEquals("01 8", strings.get(0)); @@ -89,4 +90,19 @@ public class StrSplitterTest { Assert.assertEquals(" 345678901823456178", strings.get(1)); Assert.assertEquals("", strings.get(2)); } + + @Test + public void issue3421Test() { + List 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); + } }