From commits-return-70235-archive-asf-public=cust-asf.ponee.io@commons.apache.org Sat Nov 2 16:21:44 2019 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [207.244.88.153]) by mx-eu-01.ponee.io (Postfix) with SMTP id B4C8F180661 for ; Sat, 2 Nov 2019 17:21:43 +0100 (CET) Received: (qmail 78588 invoked by uid 500); 2 Nov 2019 16:21:42 -0000 Mailing-List: contact commits-help@commons.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@commons.apache.org Delivered-To: mailing list commits@commons.apache.org Received: (qmail 78552 invoked by uid 99); 2 Nov 2019 16:21:41 -0000 Received: from ec2-52-202-80-70.compute-1.amazonaws.com (HELO gitbox.apache.org) (52.202.80.70) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 02 Nov 2019 16:21:41 +0000 Received: by gitbox.apache.org (ASF Mail Server at gitbox.apache.org, from userid 33) id C899C80620; Sat, 2 Nov 2019 16:21:41 +0000 (UTC) Date: Sat, 02 Nov 2019 16:21:43 +0000 To: "commits@commons.apache.org" Subject: [commons-compress] 02/03: COMPRESS-497 review cosmetics MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit From: bodewig@apache.org In-Reply-To: <157271170170.8143.3117209846371128691@gitbox.apache.org> References: <157271170170.8143.3117209846371128691@gitbox.apache.org> X-Git-Host: gitbox.apache.org X-Git-Repo: commons-compress X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Rev: 21ee2655b2a01c251855382d8d3f69f2fe813349 X-Git-NotificationType: diff X-Git-Multimail-Version: 1.5.dev Auto-Submitted: auto-generated Message-Id: <20191102162141.C899C80620@gitbox.apache.org> 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 commit 21ee2655b2a01c251855382d8d3f69f2fe813349 Author: Stefan Bodewig AuthorDate: Sat Nov 2 17:18:32 2019 +0100 COMPRESS-497 review cosmetics --- .../compress/archivers/sevenz/SevenZFile.java | 71 ++++++++++++---------- 1 file changed, 38 insertions(+), 33 deletions(-) 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 f85d202..1eb182e 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 @@ -465,43 +465,48 @@ public class SevenZFile implements Closeable { return initializeArchive(startHeader, password, true); } else { // No valid header found - probably first file of multipart archive was removed too early. Scan for end header. - ByteBuffer nidBuf = ByteBuffer.allocate(1); - final long searchLimit = 1024 * 1024 * 1; - final long previousDataSize = channel.position() + 20; // Main header, plus bytes that readStartHeader would read - final long minPos; - // Determine minimal position - can't start before current position - if (channel.position() + searchLimit > channel.size()) { - minPos = channel.position(); - } else { - minPos = channel.size() - searchLimit; - } - long pos = channel.size() - 1; - // Loop: Try from end of archive - while (pos > minPos) { - pos--; - channel.position(pos); - nidBuf.rewind(); - channel.read(nidBuf); - int nid = nidBuf.array()[0]; - // First indicator: Byte equals one of these header identifiers - if ((nid == NID.kEncodedHeader) || (nid == NID.kHeader)) { - try { - // Try to initialize Archive structure from here - final StartHeader startHeader = new StartHeader(); - startHeader.nextHeaderOffset = pos - previousDataSize; - startHeader.nextHeaderSize = channel.size() - pos; - Archive result = initializeArchive(startHeader, password, false); - // Sanity check: There must be some data... - if (result.packSizes!=null && result.files.length>0) { - return result; - } - } catch (Exception ignore) { - // Wrong guess... + return tryToLocateEndHeader(password); + } + } + + private Archive tryToLocateEndHeader(final byte[] password) throws IOException { + ByteBuffer nidBuf = ByteBuffer.allocate(1); + final long searchLimit = 1024 * 1024 * 1; + // Main header, plus bytes that readStartHeader would read + final long previousDataSize = channel.position() + 20; + final long minPos; + // Determine minimal position - can't start before current position + if (channel.position() + searchLimit > channel.size()) { + minPos = channel.position(); + } else { + minPos = channel.size() - searchLimit; + } + long pos = channel.size() - 1; + // Loop: Try from end of archive + while (pos > minPos) { + pos--; + channel.position(pos); + nidBuf.rewind(); + channel.read(nidBuf); + int nid = nidBuf.array()[0]; + // First indicator: Byte equals one of these header identifiers + if (nid == NID.kEncodedHeader || nid == NID.kHeader) { + try { + // Try to initialize Archive structure from here + final StartHeader startHeader = new StartHeader(); + startHeader.nextHeaderOffset = pos - previousDataSize; + startHeader.nextHeaderSize = channel.size() - pos; + Archive result = initializeArchive(startHeader, password, false); + // Sanity check: There must be some data... + if (result.packSizes != null && result.files.length > 0) { + return result; } + } catch (Exception ignore) { + // Wrong guess... } } - throw new IOException("Start header corrupt and unable to guess end header"); } + throw new IOException("Start header corrupt and unable to guess end header"); } private Archive initializeArchive(StartHeader startHeader, final byte[] password, boolean verifyCrc) throws IOException {