This is an automated email from the ASF dual-hosted git repository. bodewig pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
The following commit(s) were added to refs/heads/master by this push: new b05ed49 COMPRESS-567 and even more 7z sanity checks b05ed49 is described below commit b05ed497feadf0fc69f49eb23d6b37d0509d7855 Author: Stefan Bodewig <bode...@apache.org> AuthorDate: Sat May 22 21:08:32 2021 +0200 COMPRESS-567 and even more 7z sanity checks --- .../commons/compress/archivers/sevenz/Folder.java | 22 ++++-- .../compress/archivers/sevenz/SevenZFile.java | 86 +++++++++++++++++----- 2 files changed, 84 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java index dff9eea..1725be0 100644 --- a/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java +++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java @@ -17,6 +17,7 @@ */ package org.apache.commons.compress.archivers.sevenz; +import java.util.Collections; import java.util.LinkedList; /** @@ -53,9 +54,12 @@ class Folder { * from the output of the first and so on.</p> */ Iterable<Coder> getOrderedCoders() { + if (packedStreams == null || coders == null || packedStreams.length == 0 || coders.length == 0) { + return Collections.emptyList(); + } final LinkedList<Coder> l = new LinkedList<>(); int current = (int) packedStreams[0]; // more that 2^31 coders? - while (current != -1) { + while (current >= 0 && current < coders.length) { l.addLast(coders[current]); final int pair = findBindPairForOutStream(current); current = pair != -1 ? (int) bindPairs[pair].inIndex : -1; @@ -64,18 +68,22 @@ class Folder { } int findBindPairForInStream(final int index) { - for (int i = 0; i < bindPairs.length; i++) { - if (bindPairs[i].inIndex == index) { - return i; + if (bindPairs != null) { + for (int i = 0; i < bindPairs.length; i++) { + if (bindPairs[i].inIndex == index) { + return i; + } } } return -1; } int findBindPairForOutStream(final int index) { - for (int i = 0; i < bindPairs.length; i++) { - if (bindPairs[i].outIndex == index) { - return i; + if (bindPairs != null) { + for (int i = 0; i < bindPairs.length; i++) { + if (bindPairs[i].outIndex == index) { + return i; + } } } return -1; diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java index 1a1b029..7a936a7 100644 --- a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java +++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java @@ -589,7 +589,7 @@ public class SevenZFile implements Closeable { if (nid == NID.kAdditionalStreamsInfo) { throw new IOException("Additional streams unsupported"); - //nid = header.readUnsignedByte(); + //nid = getUnsignedByte(header); } if (nid == NID.kMainStreamsInfo) { @@ -620,7 +620,7 @@ public class SevenZFile implements Closeable { if (nid == NID.kAdditionalStreamsInfo) { throw new IOException("Additional streams unsupported"); - //nid = header.readUnsignedByte(); + //nid = getUnsignedByte(header); } if (nid == NID.kMainStreamsInfo) { @@ -647,7 +647,11 @@ public class SevenZFile implements Closeable { final long propertySize = readUint64(input); assertFitsIntoNonNegativeInt("propertySize", propertySize); final byte[] property = new byte[(int)propertySize]; - input.get(property); + try { + input.get(property); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } nid = getUnsignedByte(input); } } @@ -819,7 +823,11 @@ public class SevenZFile implements Closeable { archive.packCrcs = new long[numPackStreamsInt]; for (int i = 0; i < numPackStreamsInt; i++) { if (archive.packCrcsDefined.get(i)) { - archive.packCrcs[i] = 0xffffFFFFL & header.getInt(); + try { + archive.packCrcs[i] = 0xffffFFFFL & header.getInt(); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } } } @@ -920,7 +928,11 @@ public class SevenZFile implements Closeable { for (int i = 0; i < numFoldersInt; i++) { if (crcsDefined.get(i)) { folders[i].hasCrc = true; - folders[i].crc = 0xffffFFFFL & header.getInt(); + try { + folders[i].crc = 0xffffFFFFL & header.getInt(); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } } else { folders[i].hasCrc = false; } @@ -1056,7 +1068,11 @@ public class SevenZFile implements Closeable { final long[] missingCrcs = new long[numDigests]; for (int i = 0; i < numDigests; i++) { if (hasMissingCrc.get(i)) { - missingCrcs[i] = 0xffffFFFFL & header.getInt(); + try { + missingCrcs[i] = 0xffffFFFFL & header.getInt(); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } } } int nextCrc = 0; @@ -1100,7 +1116,11 @@ public class SevenZFile implements Closeable { for (int i = 0; i < numCoders; i++) { final int bits = getUnsignedByte(header); final int idSize = bits & 0xf; - header.get(new byte[idSize]); + try { + header.get(new byte[idSize]); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } final boolean isSimple = (bits & 0x10) == 0; final boolean hasAttributes = (bits & 0x20) != 0; @@ -1192,7 +1212,11 @@ public class SevenZFile implements Closeable { final boolean moreAlternativeMethods = (bits & 0x80) != 0; coders[i].decompressionMethodId = new byte[idSize]; - header.get(coders[i].decompressionMethodId); + try { + header.get(coders[i].decompressionMethodId); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } if (isSimple) { coders[i].numInStreams = 1; coders[i].numOutStreams = 1; @@ -1206,7 +1230,11 @@ public class SevenZFile implements Closeable { final long propertiesSize = readUint64(header); assertFitsIntoNonNegativeInt("propertiesSize", propertiesSize); coders[i].properties = new byte[(int)propertiesSize]; - header.get(coders[i].properties); + try { + header.get(coders[i].properties); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } } // would need to keep looping as above: while (moreAlternativeMethods) { @@ -1333,9 +1361,13 @@ public class SevenZFile implements Closeable { int filesSeen = 0; for (int i = 0; i < namesLength; i += 2) { - final char c = header.getChar(); - if (c == 0) { - filesSeen++; + try { + final char c = header.getChar(); + if (c == 0) { + filesSeen++; + } + } catch (BufferUnderflowException ex) { + throw new IOException(ex); } } if (filesSeen != stats.numberOfEntries) { @@ -1461,7 +1493,11 @@ public class SevenZFile implements Closeable { assertFitsIntoNonNegativeInt("file names length", size - 1); final byte[] names = new byte[(int) (size - 1)]; final int namesLength = names.length; - header.get(names); + try { + header.get(names); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } int nextFile = 0; int nextName = 0; for (int i = 0; i < namesLength; i += 2) { @@ -1488,7 +1524,11 @@ public class SevenZFile implements Closeable { final SevenZArchiveEntry entryAtIndex = fileMap.get(i); entryAtIndex.setHasCreationDate(timesDefined.get(i)); if (entryAtIndex.getHasCreationDate()) { - entryAtIndex.setCreationDate(header.getLong()); + try { + entryAtIndex.setCreationDate(header.getLong()); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } } } break; @@ -1504,7 +1544,11 @@ public class SevenZFile implements Closeable { final SevenZArchiveEntry entryAtIndex = fileMap.get(i); entryAtIndex.setHasAccessDate(timesDefined.get(i)); if (entryAtIndex.getHasAccessDate()) { - entryAtIndex.setAccessDate(header.getLong()); + try { + entryAtIndex.setAccessDate(header.getLong()); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } } } break; @@ -1520,7 +1564,11 @@ public class SevenZFile implements Closeable { final SevenZArchiveEntry entryAtIndex = fileMap.get(i); entryAtIndex.setHasLastModifiedDate(timesDefined.get(i)); if (entryAtIndex.getHasLastModifiedDate()) { - entryAtIndex.setLastModifiedDate(header.getLong()); + try { + entryAtIndex.setLastModifiedDate(header.getLong()); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } } } break; @@ -1536,7 +1584,11 @@ public class SevenZFile implements Closeable { final SevenZArchiveEntry entryAtIndex = fileMap.get(i); entryAtIndex.setHasWindowsAttributes(attributesDefined.get(i)); if (entryAtIndex.getHasWindowsAttributes()) { - entryAtIndex.setWindowsAttributes(header.getInt()); + try { + entryAtIndex.setWindowsAttributes(header.getInt()); + } catch (BufferUnderflowException ex) { + throw new IOException(ex); + } } } break;