diff --git a/CHANGELOG.md b/CHANGELOG.md index bdaad4205..c6df258e9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ # 🚀Changelog ------------------------------------------------------------------------------------------------------------- -# 5.8.30(2024-07-31) +# 5.8.30(2024-08-01) ### 🐣新特性 * 【core 】 Converter转换规则变更,空对象、空值转为Bean时,创建默认对象,而非null(issue#3649@Github) @@ -26,6 +26,7 @@ * 【core 】 修复IdcardUtil.isValidHKCard校验问题(issue#IAFOLI@Gitee) * 【core 】 修复Convert.digitToChinese(0)输出金额无`元整问题`(issue#3662@Github) * 【core 】 修复CsvParser中对正文中双引号处理逻辑问题(pr#1244@Gitee) +* 【core 】 修复ZipUtil.zip压缩到本目录时可能造成的死循环问题(issue#IAGYDG@Gitee) ------------------------------------------------------------------------------------------------------------- # 5.8.29(2024-07-03) diff --git a/hutool-core/src/main/java/cn/hutool/core/compress/ZipWriter.java b/hutool-core/src/main/java/cn/hutool/core/compress/ZipWriter.java index fef99f062..ff724b747 100755 --- a/hutool-core/src/main/java/cn/hutool/core/compress/ZipWriter.java +++ b/hutool-core/src/main/java/cn/hutool/core/compress/ZipWriter.java @@ -48,6 +48,7 @@ public class ZipWriter implements Closeable { return new ZipWriter(out, charset); } + private File zipFile; private final ZipOutputStream out; /** @@ -57,6 +58,7 @@ public class ZipWriter implements Closeable { * @param charset 编码 */ public ZipWriter(File zipFile, Charset charset) { + this.zipFile = zipFile; this.out = getZipOutputStream(zipFile, charset); } @@ -254,6 +256,11 @@ public class ZipWriter implements Closeable { } } } else { + // issue#IAGYDG 检查加入的文件是否为压缩结果文件本身,避免死循环 + if (FileUtil.equals(file, zipFile)) { + return this; + } + // 如果是文件或其它符号,则直接压缩该文件 putEntry(subPath, FileUtil.getInputStream(file)); } diff --git a/hutool-core/src/test/java/cn/hutool/core/compress/IssueIAGYDGTest.java b/hutool-core/src/test/java/cn/hutool/core/compress/IssueIAGYDGTest.java new file mode 100644 index 000000000..2841988c0 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/compress/IssueIAGYDGTest.java @@ -0,0 +1,21 @@ +package cn.hutool.core.compress; + +import cn.hutool.core.util.ZipUtil; +import org.junit.Ignore; +import org.junit.Test; + +import java.io.File; + +/** + * https://gitee.com/dromara/hutool/issues/IAGYDG + */ +public class IssueIAGYDGTest { + @Test + @Ignore + public void zipTest() { + // 第一次压缩后,IssueIAGYDG.zip也会作为文件压缩到IssueIAGYDG.zip中,导致死循环 + final File filea = new File("d:/test/"); + final File fileb = new File("d:/test/IssueIAGYDG.zip"); + ZipUtil.zip(fileb, false, filea.listFiles()); + } +}