From c6ce5fe215bc851877c6788c697726a5e0de6752 Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 12 Mar 2023 15:58:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DFileMagicNumber=E9=95=BF?= =?UTF-8?q?=E5=BA=A6=E5=88=A4=E6=96=AD=E9=97=AE=E9=A2=98=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E8=B6=8A=E7=95=8C=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../cn/hutool/core/io/FileMagicNumber.java | 12 ++++--- .../cn/hutool/core/io/FileTypeUtilTest.java | 35 +++++++++++-------- hutool-core/src/test/resources/text.txt | 1 + 4 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 hutool-core/src/test/resources/text.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd8b4115..5e278aa6e 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * 【crypto】 修复NoSuchMethodError未捕获问题(issue#2966@Github) * 【poi 】 修复SXSSFWorkbook调用setComment时错位的问题(issue#I6MBS5@Gitee) * 【core 】 修复BeanUtil.hasGetter没有跳过getClass方法的问题(issue#I6MBS5@Gitee) +* 【core 】 修复FileMagicNumber长度判断问题导致的越界异常(issue#I6MACI@Gitee) ------------------------------------------------------------------------------------------------------------- # 5.8.15 (2023-03-09) diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileMagicNumber.java b/hutool-core/src/main/java/cn/hutool/core/io/FileMagicNumber.java index c6d142075..47eb24881 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileMagicNumber.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileMagicNumber.java @@ -325,6 +325,9 @@ public enum FileMagicNumber { WOFF("font/woff", "woff") { @Override public boolean match(final byte[] bytes) { + if (bytes.length < 8) { + return false; + } final boolean flag1 = Objects.equals(bytes[0], (byte) 0x77) && Objects.equals(bytes[1], (byte) 0x4f) && Objects.equals(bytes[2], (byte) 0x46) @@ -341,13 +344,15 @@ public enum FileMagicNumber { && Objects.equals(bytes[5], (byte) 0x72) && Objects.equals(bytes[6], (byte) 0x75) && Objects.equals(bytes[7], (byte) 0x65); - return bytes.length > 7 - && (flag1 && (flag2 || flag3 || flag4)); + return flag1 && (flag2 || flag3 || flag4); } }, WOFF2("font/woff2", "woff2") { @Override public boolean match(final byte[] bytes) { + if (bytes.length < 8) { + return false; + } final boolean flag1 = Objects.equals(bytes[0], (byte) 0x77) && Objects.equals(bytes[1], (byte) 0x4f) && Objects.equals(bytes[2], (byte) 0x46) @@ -364,8 +369,7 @@ public enum FileMagicNumber { && Objects.equals(bytes[5], (byte) 0x72) && Objects.equals(bytes[6], (byte) 0x75) && Objects.equals(bytes[7], (byte) 0x65); - return bytes.length > 7 - && (flag1 && (flag2 || flag3 || flag4)); + return flag1 && (flag2 || flag3 || flag4); } }, TTF("font/ttf", "ttf") { diff --git a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java index d33ea0350..bd2dc1a3e 100755 --- a/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/io/FileTypeUtilTest.java @@ -19,38 +19,38 @@ public class FileTypeUtilTest { @Test @Ignore public void fileTypeUtilTest() { - File file = FileUtil.file("hutool.jpg"); - String type = FileTypeUtil.getType(file); + final File file = FileUtil.file("hutool.jpg"); + final String type = FileTypeUtil.getType(file); Assert.assertEquals("jpg", type); FileTypeUtil.putFileType("ffd8ffe000104a464946", "new_jpg"); - String newType = FileTypeUtil.getType(file); + final String newType = FileTypeUtil.getType(file); Assert.assertEquals("new_jpg", newType); } @Test @Ignore public void emptyTest() { - File file = FileUtil.file("d:/empty.txt"); - String type = FileTypeUtil.getType(file); + final File file = FileUtil.file("d:/empty.txt"); + final String type = FileTypeUtil.getType(file); Console.log(type); } @Test @Ignore public void docTest() { - File file = FileUtil.file("f:/test/test.doc"); - String type = FileTypeUtil.getType(file); + final File file = FileUtil.file("f:/test/test.doc"); + final String type = FileTypeUtil.getType(file); Console.log(type); } @Test @Ignore public void ofdTest() { - File file = FileUtil.file("e:/test.ofd"); - String hex = IoUtil.readHex64Upper(FileUtil.getInputStream(file)); + final File file = FileUtil.file("e:/test.ofd"); + final String hex = IoUtil.readHex64Upper(FileUtil.getInputStream(file)); Console.log(hex); - String type = FileTypeUtil.getType(file); + final String type = FileTypeUtil.getType(file); Console.log(type); Assert.assertEquals("ofd", type); } @@ -59,18 +59,18 @@ public class FileTypeUtilTest { @Test @Ignore public void inputStreamAndFilenameTest() { - File file = FileUtil.file("e:/laboratory/test.xlsx"); - String type = FileTypeUtil.getType(file); + final File file = FileUtil.file("e:/laboratory/test.xlsx"); + final String type = FileTypeUtil.getType(file); Assert.assertEquals("xlsx", type); } @Test @Ignore public void getTypeFromInputStream() throws IOException { - File file = FileUtil.file("d:/test/pic.jpg"); + final File file = FileUtil.file("d:/test/pic.jpg"); final BufferedInputStream inputStream = FileUtil.getInputStream(file); inputStream.mark(0); - String type = FileTypeUtil.getType(inputStream); + final String type = FileTypeUtil.getType(inputStream); inputStream.reset(); } @@ -85,4 +85,11 @@ public class FileTypeUtilTest { Console.log(type); } + @Test + public void issueI6MACITest() { + final File file = FileUtil.file("text.txt"); + final String type = FileTypeUtil.getType(file); + Assert.assertEquals("txt", type); + } + } diff --git a/hutool-core/src/test/resources/text.txt b/hutool-core/src/test/resources/text.txt new file mode 100644 index 000000000..d00491fd7 --- /dev/null +++ b/hutool-core/src/test/resources/text.txt @@ -0,0 +1 @@ +1