From 7b16b3d90b91445fd6af0adfed22c07413d4fab7 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Thu, 27 Jan 2022 12:08:31 +0800 Subject: [PATCH] fix: invalid subheader type would throw npe and make the extract loop closes #73 --- src/main/java/com/github/junrar/Archive.java | 5 ++++- .../java/com/github/junrar/AbnormalFilesTest.java | 3 ++- .../resources/com/github/junrar/abnormal/loop.rar | Bin 0 -> 529 bytes 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/com/github/junrar/abnormal/loop.rar diff --git a/src/main/java/com/github/junrar/Archive.java b/src/main/java/com/github/junrar/Archive.java index 7af74a57c..47baa3edc 100644 --- a/src/main/java/com/github/junrar/Archive.java +++ b/src/main/java/com/github/junrar/Archive.java @@ -45,6 +45,7 @@ import com.github.junrar.rarfile.RARVersion; import com.github.junrar.rarfile.SignHeader; import com.github.junrar.rarfile.SubBlockHeader; +import com.github.junrar.rarfile.SubBlockHeaderType; import com.github.junrar.rarfile.UnixOwnersHeader; import com.github.junrar.rarfile.UnrarHeadertype; import com.github.junrar.unpack.ComprDataIO; @@ -449,7 +450,9 @@ private void readHeaders(final long fileLength) throws IOException, RarException final SubBlockHeader subHead = new SubBlockHeader(blockHead, subHeadbuffer); subHead.print(); - switch (subHead.getSubType()) { + SubBlockHeaderType subType = subHead.getSubType(); + if (subType == null) break; + switch (subType) { case MAC_HEAD: { final byte[] macHeaderbuffer = safelyAllocate(MacInfoHeader.MacInfoHeaderSize, MAX_HEADER_SIZE); rawData.readFully(macHeaderbuffer, macHeaderbuffer.length); diff --git a/src/test/java/com/github/junrar/AbnormalFilesTest.java b/src/test/java/com/github/junrar/AbnormalFilesTest.java index 405bc9f32..fa09f4841 100644 --- a/src/test/java/com/github/junrar/AbnormalFilesTest.java +++ b/src/test/java/com/github/junrar/AbnormalFilesTest.java @@ -58,7 +58,8 @@ public void extractFromStream(String filePath, Class expectedException) throw private static Stream provideFilesAndExpectedExceptionType() { return Stream.of( Arguments.of("abnormal/corrupt-header.rar", CorruptHeaderException.class), - Arguments.of("abnormal/mainHeaderNull.rar", BadRarArchiveException.class) + Arguments.of("abnormal/mainHeaderNull.rar", BadRarArchiveException.class), + Arguments.of("abnormal/loop.rar", CorruptHeaderException.class) ); } } diff --git a/src/test/resources/com/github/junrar/abnormal/loop.rar b/src/test/resources/com/github/junrar/abnormal/loop.rar new file mode 100644 index 0000000000000000000000000000000000000000..8f9db1f6f73693b3be8509cd9a9ba76af39310ba GIT binary patch literal 529 zcmWGaEK-zWXE;Bhn2!Mnv_OQoc!@%TAA>g|1A`J10|Rqvsp|K=C99ldP4pO+G%_&6 z$NPFZ`v*tF=*1@%6y&68mgJWvXXs`o=jZ8~8|W4kr6%X+7UUPFrsx&qrE}gD^f`UC zF+9a3q$+OeyG7jT>iZ|9Zr#30D1ui!%C%q6#o_7nma1)@r_~kX;2M$K1JuYrHN9%l zyEu@>(-55#Zn+*6+`M0^cU!e*22f{I`?2|ZfsSQ3vbT)UwT8igm5~kP7X}9X$7z`f zyXrI){zg7v+dH$RMHu>bQezQI5d7^q;7mo_7VE$?evCEtUzX9=0R>dxK&8wr$QVqgqkv0M3N zIUFRwSwKcOG6%{oE-wYLE(5W}B%ldF46rC=VBm#V28z;3M1(>-3nza=Shm1;E-wcF DQOL?c literal 0 HcmV?d00001