in src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java [1763:1850]
private int sanityCheckFolder(final ByteBuffer header, final ArchiveStatistics stats)
throws IOException {
final int numCoders = assertFitsIntoNonNegativeInt("numCoders", readUint64(header));
if (numCoders == 0) {
throw new IOException("Folder without coders");
}
stats.numberOfCoders += numCoders;
long totalOutStreams = 0;
long totalInStreams = 0;
for (int i = 0; i < numCoders; i++) {
final int bits = getUnsignedByte(header);
final int idSize = bits & 0xf;
get(header, new byte[idSize]);
final boolean isSimple = (bits & 0x10) == 0;
final boolean hasAttributes = (bits & 0x20) != 0;
final boolean moreAlternativeMethods = (bits & 0x80) != 0;
if (moreAlternativeMethods) {
throw new IOException("Alternative methods are unsupported, please report. " + // NOSONAR
"The reference implementation doesn't support them either.");
}
if (isSimple) {
totalInStreams++;
totalOutStreams++;
} else {
totalInStreams +=
assertFitsIntoNonNegativeInt("numInStreams", readUint64(header));
totalOutStreams +=
assertFitsIntoNonNegativeInt("numOutStreams", readUint64(header));
}
if (hasAttributes) {
final int propertiesSize =
assertFitsIntoNonNegativeInt("propertiesSize", readUint64(header));
if (skipBytesFully(header, propertiesSize) < propertiesSize) {
throw new IOException("invalid propertiesSize in folder");
}
}
}
assertFitsIntoNonNegativeInt("totalInStreams", totalInStreams);
assertFitsIntoNonNegativeInt("totalOutStreams", totalOutStreams);
stats.numberOfOutStreams += totalOutStreams;
stats.numberOfInStreams += totalInStreams;
if (totalOutStreams == 0) {
throw new IOException("Total output streams can't be 0");
}
final int numBindPairs =
assertFitsIntoNonNegativeInt("numBindPairs", totalOutStreams - 1);
if (totalInStreams < numBindPairs) {
throw new IOException("Total input streams can't be less than the number of bind pairs");
}
final BitSet inStreamsBound = new BitSet((int) totalInStreams);
for (int i = 0; i < numBindPairs; i++) {
final int inIndex = assertFitsIntoNonNegativeInt("inIndex", readUint64(header));
if (totalInStreams <= inIndex) {
throw new IOException("inIndex is bigger than number of inStreams");
}
inStreamsBound.set(inIndex);
final int outIndex = assertFitsIntoNonNegativeInt("outIndex", readUint64(header));
if (totalOutStreams <= outIndex) {
throw new IOException("outIndex is bigger than number of outStreams");
}
}
final int numPackedStreams =
assertFitsIntoNonNegativeInt("numPackedStreams", totalInStreams - numBindPairs);
if (numPackedStreams == 1) {
if (inStreamsBound.nextClearBit(0) == -1) {
throw new IOException("Couldn't find stream's bind pair index");
}
} else {
for (int i = 0; i < numPackedStreams; i++) {
final int packedStreamIndex =
assertFitsIntoNonNegativeInt("packedStreamIndex", readUint64(header));
if (packedStreamIndex >= totalInStreams) {
throw new IOException("packedStreamIndex is bigger than number of totalInStreams");
}
}
}
return (int) totalOutStreams;
}