From 51e7151591269f7ffc3da2e432bc8c85b1d9b3a2 Mon Sep 17 00:00:00 2001
From: reger
Date: Wed, 9 Mar 2016 01:01:58 +0100
Subject: [PATCH] more fixes for sevenZip parser exception on specific archives
Found 2 more cases were modified code throws exceptions while original J7Zip
unpacks it. Reimplemented error prone CoderMixer2ST from unmodified
J7Zip.jar.
---
lib/J7Zip-modified.jar | Bin 139171 -> 139602 bytes
.../src/SevenZip/Archive/Common/BindInfo.java | 22 +-
.../Archive/Common/CoderMixer2ST.java | 347 +++++++++++-------
.../Compression/Branch/BCJ2_x86_Decoder.java | 16 +-
.../src/SevenZip/ICompressCoder2.java | 2 +-
5 files changed, 230 insertions(+), 157 deletions(-)
diff --git a/lib/J7Zip-modified.jar b/lib/J7Zip-modified.jar
index 591256c7a655ee00adde5934ef348dde8f145f6d..f6bee9dcc2cd01db6e0a26ef1cde747ae21e2c84 100644
GIT binary patch
delta 15064
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
J(4GnR{{Z{SGnN1V
delta 14892
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 null
if no InStream for streamIndex
could be
- * found.
+ * @return the coder index number
*/
- public int[] FindInStream(int streamIndex) {
+ public int FindInStream(int streamIndex) {
for (int i=0; iReturns null
if no OutStream for streamIndex
could be
- * found.
+ * @return the coder index number
*/
- public int[] FindOutStream(int streamIndex) {
+ public int FindOutStream(int streamIndex) {
for (int i=0; i coders = new Vector();
- int mainCoderIndex;
-
- public CoderMixer2ST(BindInfo bindInfo) {
- this.bindInfo = bindInfo;
- }
-
- public void AddCoderCommon(boolean isMain) {
- CoderStreamsInfo csi = (CoderStreamsInfo)bindInfo.Coders.get(coders.size());
- coders.add(new STCoderInfo(csi.NumInStreams, csi.NumOutStreams, isMain));
- }
-
- public void AddCoder2(ICompressCoder2 coder, boolean isMain) {
- AddCoderCommon(isMain);
- coders.lastElement().Coder2 = coder;
- }
-
- public void AddCoder(ICompressCoder coder, boolean isMain) {
- AddCoderCommon(isMain);
- coders.lastElement().Coder = coder;
- }
-
- public void ReInit() {
- }
-
- public void SetCoderInfo(int coderIndex, LongVector inSizes, LongVector outSizes) {
- // _coders[coderIndex].SetCoderInfo(inSizes, outSizes);
- coders.get(coderIndex).SetCoderInfo(inSizes, outSizes);
- }
+
+public class CoderMixer2ST implements ICompressCoder2 , CoderMixer2 {
+
+ BindInfo _bindInfo = new BindInfo();
+ Vector _coders = new Vector();
+ int _mainCoderIndex;
+
+ public CoderMixer2ST(BindInfo bindInfo) {
+ this._bindInfo = bindInfo;
+ }
+
+ public void AddCoderCommon(boolean isMain) {
+ CoderStreamsInfo csi = _bindInfo.Coders.get(_coders.size());
+ _coders.add(new STCoderInfo(csi.NumInStreams, csi.NumOutStreams, isMain));
+ }
+
+ public void AddCoder2(ICompressCoder2 coder, boolean isMain) {
+ AddCoderCommon(isMain);
+ _coders.lastElement().Coder2 = coder;
+ }
+
+ public void AddCoder(ICompressCoder coder, boolean isMain) {
+ AddCoderCommon(isMain);
+ _coders.lastElement().Coder = coder;
+ }
+
+ @Override
+ public void ReInit() {
+ }
+
+ @Override
+ public void SetCoderInfo(int coderIndex,LongVector inSizes, LongVector outSizes) {
+ // _coders[coderIndex].SetCoderInfo(inSizes, outSizes);
+ _coders.get(coderIndex).SetCoderInfo(inSizes, outSizes);
+ }
public int GetInStream(
Vector inStreams,
//Object useless_inSizes, // const UInt64 **inSizes,
int streamIndex,
InputStream [] inStreamRes) {
- java.io.InputStream seqInStream;
+ InputStream seqInStream;
int i;
- for(i = 0; i < bindInfo.InStreams.size(); i++)
- if (bindInfo.InStreams.get(i) == streamIndex) {
+ for(i = 0; i < _bindInfo.InStreams.size(); i++)
+ if (_bindInfo.InStreams.get(i) == streamIndex) {
seqInStream = inStreams.get(i);
inStreamRes[0] = seqInStream; // seqInStream.Detach();
return HRESULT.S_OK;
}
- int binderIndex = bindInfo.FindBinderForInStream(streamIndex);
+ int binderIndex = _bindInfo.FindBinderForInStream(streamIndex);
if (binderIndex < 0)
return HRESULT.E_INVALIDARG;
+ int coderIndex = _bindInfo.FindOutStream(_bindInfo.BindPairs.get(binderIndex).OutIndex);
+ if (coderIndex < 0)
+ return HRESULT.E_INVALIDARG;
- int tmp1[] = new int[2]; // TBD
- //int tmp2 [] = new int[1]; // TBD
- tmp1 = bindInfo.FindOutStream(bindInfo.BindPairs.get(binderIndex).OutIndex);
- // , tmp1 /* coderIndex */ , tmp2 /* coderStreamIndex */ );
- int coderIndex = tmp1[0], coderStreamIndex = tmp1[0];
-
- CoderInfo coder = coders.get(coderIndex);
+ CoderInfo coder = _coders.get(coderIndex);
if (coder.Coder == null)
return HRESULT.E_NOTIMPL;
- seqInStream = (java.io.InputStream)coder.Coder; // coder.Coder.QueryInterface(IID_ISequentialInStream, &seqInStream);
+ seqInStream = (InputStream)coder.Coder; // coder.Coder.QueryInterface(IID_ISequentialInStream, &seqInStream);
if (seqInStream == null)
return HRESULT.E_NOTIMPL;
- int startIndex = bindInfo.GetCoderInStreamIndex(coderIndex);
+ int startIndex = _bindInfo.GetCoderInStreamIndex(coderIndex);
if (coder.Coder == null)
return HRESULT.E_NOTIMPL;
@@ -91,7 +92,7 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
if (coder.NumInStreams > 1)
return HRESULT.E_NOTIMPL;
for (i = 0; i < (int)coder.NumInStreams; i++) {
- InputStream [] tmp = new java.io.InputStream[1];
+ InputStream [] tmp = new InputStream[1];
int res = GetInStream(inStreams, /*useless_inSizes,*/ startIndex + i, tmp /* &seqInStream2 */ );
if (res != HRESULT.S_OK) return res;
InputStream seqInStream2 = tmp[0];
@@ -102,92 +103,168 @@ public class CoderMixer2ST implements ICompressCoder2, CoderMixer2 {
return HRESULT.S_OK;
}
- public void Code(
- Vector inStreams,
- //Object useless_inSizes, // const UInt64 ** inSizes ,
- int numInStreams,
- Vector outStreams,
- //Object useless_outSizes, // const UInt64 ** /* outSizes */,
- int numOutStreams,
- ICompressProgressInfo progress) throws IOException {
- if (numInStreams != bindInfo.InStreams.size() || numOutStreams != bindInfo.OutStreams.size())
- throw new IllegalArgumentException("internal error: numInStreams != _bindInfo.InStreams.size() || numOutStreams != _bindInfo.OutStreams.size()");
-
- // Find main coder
- int mainCoderIndex = -1;
- for (int i=0; i 1) {
- if (mainCoderIndex >= 0) // TODO: description, what exactly is not implemented
- throw new IOException("not implemented");
- mainCoderIndex = i;
- }
-
- if (mainCoderIndex < 0)
- mainCoderIndex = 0;
-
- // _mainCoderIndex = 0;
- // _mainCoderIndex = _coders.Size() - 1;
- CoderInfo mainCoder = coders.get(mainCoderIndex);
-
- Vector seqInStreams = new Vector(); // CObjectVector< CMyComPtr >
- int startInIndex = bindInfo.GetCoderInStreamIndex(mainCoderIndex);
-
- // this original (from J7Zip 4.43a) replaces blows loop, as with LZMA BCJ2 format seqInStreams.size() is incorrect (array out of index) with modified code
- for (int i = 0; i < (int)mainCoder.NumInStreams; i++) {
- java.io.InputStream tmp [] = new java.io.InputStream[1];
+ public int GetOutStream(
+ Vector outStreams,
+ //Object useless_outSizes, // const UInt64 **outSizes,
+ int streamIndex,
+ OutputStream [] outStreamRes) {
+ OutputStream seqOutStream;
+ int i;
+ for(i = 0; i < _bindInfo.OutStreams.size(); i++)
+ if (_bindInfo.OutStreams.get(i) == streamIndex) {
+ seqOutStream = outStreams.get(i);
+ outStreamRes[0] = seqOutStream; // seqOutStream.Detach();
+ return HRESULT.S_OK;
+ }
+ int binderIndex = _bindInfo.FindBinderForOutStream(streamIndex);
+ if (binderIndex < 0)
+ return HRESULT.E_INVALIDARG;
+
+ int coderIndex = _bindInfo.FindInStream(_bindInfo.BindPairs.get(binderIndex).InIndex);
+ if (coderIndex < 0 )
+ return HRESULT.E_INVALIDARG;
+
+ CoderInfo coder = _coders.get(coderIndex);
+ if (coder.Coder == null)
+ return HRESULT.E_NOTIMPL;
+
+ try
+ {
+ seqOutStream = (OutputStream)coder.Coder; // coder.Coder.QueryInterface(IID_ISequentialOutStream, &seqOutStream);
+ } catch (java.lang.ClassCastException e) {
+ return HRESULT.E_NOTIMPL;
+ }
+
+ int startIndex = _bindInfo.GetCoderOutStreamIndex(coderIndex);
+
+ if (coder.Coder == null)
+ return HRESULT.E_NOTIMPL;
+
+ ICompressSetOutStream setOutStream = null;
+ try {
+ setOutStream = (ICompressSetOutStream)coder.Coder; // coder.Coder.QueryInterface(IID_ICompressSetOutStream, &setOutStream);
+ } catch (java.lang.ClassCastException e) {
+ return HRESULT.E_NOTIMPL;
+ }
+
+ if (coder.NumOutStreams > 1)
+ return HRESULT.E_NOTIMPL;
+ for (i = 0; i < (int)coder.NumOutStreams; i++) {
+ OutputStream [] tmp = new OutputStream[1];
+ int res = GetOutStream(outStreams, /*useless_outSizes,*/ startIndex + i, tmp /* &seqOutStream2 */ );
+ if (res != HRESULT.S_OK) return res;
+ OutputStream seqOutStream2 = tmp[0];
+ res = setOutStream.SetOutStream(seqOutStream2);
+ if (res != HRESULT.S_OK) return res;
+ }
+ outStreamRes[0] = seqOutStream; // seqOutStream.Detach();
+ return HRESULT.S_OK;
+ }
+
+ @Override
+ public int Code(
+ Vector inStreams,
+ //Object useless_inSizes, // const UInt64 ** inSizes ,
+ int numInStreams,
+ Vector outStreams,
+ //Object useless_outSizes, // const UInt64 ** /* outSizes */,
+ int numOutStreams,
+ ICompressProgressInfo progress) throws IOException {
+ if (numInStreams != _bindInfo.InStreams.size() ||
+ numOutStreams != _bindInfo.OutStreams.size())
+ return HRESULT.E_INVALIDARG;
+
+ // Find main coder
+ int _mainCoderIndex = -1;
+ int i;
+ for (i = 0; i < _coders.size(); i++)
+ if (_coders.get(i).IsMain) {
+ _mainCoderIndex = i;
+ break;
+ }
+ if (_mainCoderIndex < 0)
+ for (i = 0; i < _coders.size(); i++)
+ if (_coders.get(i).NumInStreams > 1) {
+ if (_mainCoderIndex >= 0)
+ return HRESULT.E_NOTIMPL;
+ _mainCoderIndex = i;
+ }
+ if (_mainCoderIndex < 0)
+ _mainCoderIndex = 0;
+
+ // _mainCoderIndex = 0;
+ // _mainCoderIndex = _coders.Size() - 1;
+ CoderInfo mainCoder = _coders.get(_mainCoderIndex);
+
+ Vector seqInStreams = new Vector(); // CObjectVector< CMyComPtr >
+ Vector seqOutStreams = new Vector(); // CObjectVector< CMyComPtr >
+ int startInIndex = _bindInfo.GetCoderInStreamIndex(_mainCoderIndex);
+ int startOutIndex = _bindInfo.GetCoderOutStreamIndex(_mainCoderIndex);
+ for (i = 0; i < (int)mainCoder.NumInStreams; i++) {
+ InputStream tmp [] = new InputStream[1];
int res = GetInStream(inStreams, /*useless_inSizes,*/ startInIndex + i, tmp /* &seqInStream */ );
- if (res != HRESULT.S_OK) return;
- java.io.InputStream seqInStream = tmp[0];
+ if (res != HRESULT.S_OK) return res;
+ InputStream seqInStream = tmp[0];
seqInStreams.add(seqInStream);
}
- /* --- replaced by above ---
- for (int i=0; i seqOutStreams = new Vector(); // CObjectVector< CMyComPtr >
- int startOutIndex = bindInfo.GetCoderOutStreamIndex(mainCoderIndex);
- for (int i=0; i seqInStreamsSpec = new Vector();
+ Vector seqOutStreamsSpec = new Vector();
+ for (i = 0; i < (int)mainCoder.NumInStreams; i++)
+ seqInStreamsSpec.add(seqInStreams.get(i));
+ for (i = 0; i < (int)mainCoder.NumOutStreams; i++)
+ seqOutStreamsSpec.add(seqOutStreams.get(i));
+
+ for (i = 0; i < _coders.size(); i++) {
+ if (i == _mainCoderIndex)
+ continue;
+ CoderInfo coder = _coders.get(i);
+
+ ICompressSetOutStreamSize setOutStreamSize = null;
+ try
+ {
+ setOutStreamSize = (ICompressSetOutStreamSize)coder.Coder;
+
+ /*int res =*/ setOutStreamSize.SetOutStreamSize(coder.OutSizePointers.get(0));
+ //if (res != HRESULT.S_OK) return res;
+ } catch (java.lang.ClassCastException e) {
+ // nothing to do
+ }
+ }
+ if (mainCoder.Coder != null) {
+ /*int res =*/ mainCoder.Coder.Code(
+ seqInStreamsSpec.get(0),
+ seqOutStreamsSpec.get(0),
+ // TBD mainCoder.InSizePointers.get(0),
+ mainCoder.OutSizePointers.get(0),
+ progress);
+ //if (res != HRESULT.S_OK) return res;
+ } else {
+ /*int res =*/ mainCoder.Coder2.Code(
+ seqInStreamsSpec, // &seqInStreamsSpec.Front(
+ //mainCoder.InSizePointers.Front(), // &mainCoder.InSizePointers.Front()
+ mainCoder.NumInStreams,
+ seqOutStreamsSpec, // &seqOutStreamsSpec.Front()
+ //mainCoder.OutSizePointers.Front(), // &mainCoder.OutSizePointers.Front()
+ mainCoder.NumOutStreams,
+ progress);
+ //if (res != HRESULT.S_OK) return res;
+ }
+
+ OutputStream stream = seqOutStreams.firstElement();
+ stream.flush();
+
+ return HRESULT.S_OK;
+ }
+
+ @Override
+ public void close() {
+
+ }
}
diff --git a/libbuild/J7Zip-modified/src/SevenZip/Compression/Branch/BCJ2_x86_Decoder.java b/libbuild/J7Zip-modified/src/SevenZip/Compression/Branch/BCJ2_x86_Decoder.java
index 39c32e0d6..1868aec37 100644
--- a/libbuild/J7Zip-modified/src/SevenZip/Compression/Branch/BCJ2_x86_Decoder.java
+++ b/libbuild/J7Zip-modified/src/SevenZip/Compression/Branch/BCJ2_x86_Decoder.java
@@ -7,10 +7,10 @@ import java.io.OutputStream;
import java.util.Vector;
import SevenZip.Compression.LZ.OutWindow;
-
import SevenZip.ICompressCoder2;
import SevenZip.ICompressProgressInfo;
import SevenZip.Common.InBuffer;
+import SevenZip.HRESULT;
public class BCJ2_x86_Decoder implements ICompressCoder2 {
@@ -32,7 +32,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
// return ((b0 == 0x0F) && ((b1 & 0xF0) == 0x80));
// }
- void CodeReal(
+ int CodeReal(
Vector inStreams,
//Object useless1, // const UInt64 ** /* inSizes */,
int numInStreams,
@@ -83,7 +83,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
int b = _mainInStream.read();
if (b == -1) {
Flush();
- return;
+ return HRESULT.S_OK;
}
_outStream.WriteByte(b); // System.out.println("0:"+b);
// if ((b != 0xE8) && (b != 0xE9) && (!IsJcc(prevByte, b))) {
@@ -116,7 +116,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
src |= ((int)b0) << 8;
b0 = _callStream.read();
- if (b0 == -1) return; // TODO: HRESULT.S_FALSE;
+ if (b0 == -1) return HRESULT.S_FALSE;
src |= ((int)b0);
} else {
@@ -133,7 +133,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
src |= ((int)b0) << 8;
b0 = _jumpStream.read();
- if(b0 == -1) return; // TODO: HRESULT.S_FALSE;
+ if(b0 == -1) return HRESULT.S_FALSE;
src |= ((int)b0);
}
@@ -153,7 +153,8 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
_outStream.Flush();
}
- public void Code(
+ @Override
+ public int Code(
Vector inStreams, // ISequentialInStream **inStreams,
//Object useless_inSizes, // const UInt64 ** /* inSizes */,
int numInStreams,
@@ -163,7 +164,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
ICompressProgressInfo progress) throws java.io.IOException {
try {
- CodeReal(inStreams, /*useless_inSizes,*/ numInStreams,
+ return CodeReal(inStreams, /*useless_inSizes,*/ numInStreams,
outStreams, /*useless_outSizes,*/ numOutStreams, progress);
} catch(java.io.IOException e) {
throw e;
@@ -180,6 +181,7 @@ public class BCJ2_x86_Decoder implements ICompressCoder2 {
_outStream.ReleaseStream();
}
+ @Override
public void close() throws java.io.IOException {
ReleaseStreams();
}
diff --git a/libbuild/J7Zip-modified/src/SevenZip/ICompressCoder2.java b/libbuild/J7Zip-modified/src/SevenZip/ICompressCoder2.java
index 3deb87e3c..aa8224f8e 100644
--- a/libbuild/J7Zip-modified/src/SevenZip/ICompressCoder2.java
+++ b/libbuild/J7Zip-modified/src/SevenZip/ICompressCoder2.java
@@ -7,7 +7,7 @@ import java.util.Vector;
public interface ICompressCoder2 {
- public void Code(
+ public int Code(
Vector inStreams,
//Object useless1, // const UInt64 ** /* inSizes */,
int numInStreams,