diff --git a/src/main/org/apache/tools/bzip2/CBZip2OutputStream.java b/src/main/org/apache/tools/bzip2/CBZip2OutputStream.java index b2ad87e09..b4922a859 100644 --- a/src/main/org/apache/tools/bzip2/CBZip2OutputStream.java +++ b/src/main/org/apache/tools/bzip2/CBZip2OutputStream.java @@ -613,7 +613,7 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { } if (ge > gs && nPart != nGroups && nPart != 1 - && ((nGroups - nPart) % 2 == 1)) { + && ((nGroups - nPart) % 2 != 0)) { aFreq -= mtfFreq[ge]; ge--; } @@ -983,9 +983,7 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { b = t; } if (b > c) { - t = b; b = c; - c = t; } if (a > b) { b = a; @@ -1030,7 +1028,7 @@ public class CBZip2OutputStream extends OutputStream implements BZip2Constants { med = med3(block[zptr[lo] + d + 1], block[zptr[hi ] + d + 1], - block[zptr[(lo + hi) >> 1] + d + 1]); + block[zptr[(lo + hi) >>> 1] + d + 1]); unLo = ltLo = lo; unHi = gtHi = hi; diff --git a/src/main/org/apache/tools/tar/TarInputStream.java b/src/main/org/apache/tools/tar/TarInputStream.java index c17d6d0da..f6c126ce4 100644 --- a/src/main/org/apache/tools/tar/TarInputStream.java +++ b/src/main/org/apache/tools/tar/TarInputStream.java @@ -218,8 +218,13 @@ public class TarInputStream extends FilterInputStream { + numToSkip + " bytes"); } - if (numToSkip > 0) { - skip(numToSkip); + while (numToSkip > 0) { + long skipped = skip(numToSkip); + if (skipped <= 0) { + throw new RuntimeException("failed to skip current tar" + + " entry"); + } + numToSkip -= skipped; } readBuf = null; diff --git a/src/main/org/apache/tools/tar/TarOutputStream.java b/src/main/org/apache/tools/tar/TarOutputStream.java index 50fa2c186..417ad28e2 100644 --- a/src/main/org/apache/tools/tar/TarOutputStream.java +++ b/src/main/org/apache/tools/tar/TarOutputStream.java @@ -310,7 +310,7 @@ public class TarOutputStream extends FilterOutputStream { wOffset += numToWrite; assemLen += numToWrite; - numToWrite -= numToWrite; + numToWrite = 0; } } diff --git a/src/main/org/apache/tools/zip/AsiExtraField.java b/src/main/org/apache/tools/zip/AsiExtraField.java index a5ce0a5a6..a9634dc43 100644 --- a/src/main/org/apache/tools/zip/AsiExtraField.java +++ b/src/main/org/apache/tools/zip/AsiExtraField.java @@ -334,4 +334,14 @@ public class AsiExtraField implements ZipExtraField, UnixStat, Cloneable { return type | (mode & PERM_MASK); } + public Object clone() { + try { + AsiExtraField cloned = (AsiExtraField) super.clone(); + cloned.crc = new CRC32(); + return cloned; + } catch (CloneNotSupportedException cnfe) { + // impossible + throw new RuntimeException(cnfe); + } + } } diff --git a/src/main/org/apache/tools/zip/UnrecognizedExtraField.java b/src/main/org/apache/tools/zip/UnrecognizedExtraField.java index 79f2e6e1b..6c59f8700 100644 --- a/src/main/org/apache/tools/zip/UnrecognizedExtraField.java +++ b/src/main/org/apache/tools/zip/UnrecognizedExtraField.java @@ -65,7 +65,7 @@ public class UnrecognizedExtraField implements ZipExtraField { * @param data the field data to use */ public void setLocalFileDataData(byte[] data) { - localData = data; + localData = copy(data); } /** @@ -81,7 +81,7 @@ public class UnrecognizedExtraField implements ZipExtraField { * @return the local data */ public byte[] getLocalFileDataData() { - return localData; + return copy(localData); } /** @@ -97,7 +97,7 @@ public class UnrecognizedExtraField implements ZipExtraField { * @param data the data to use */ public void setCentralDirectoryData(byte[] data) { - centralData = data; + centralData = copy(data); } /** @@ -118,7 +118,7 @@ public class UnrecognizedExtraField implements ZipExtraField { */ public byte[] getCentralDirectoryData() { if (centralData != null) { - return centralData; + return copy(centralData); } return getLocalFileDataData(); } @@ -134,4 +134,13 @@ public class UnrecognizedExtraField implements ZipExtraField { System.arraycopy(data, offset, tmp, 0, length); setLocalFileDataData(tmp); } + + private static byte[] copy(byte[] from) { + if (from != null) { + byte[] to = new byte[from.length]; + System.arraycopy(from, 0, to, 0, to.length); + return to; + } + return null; + } } diff --git a/src/main/org/apache/tools/zip/ZipFile.java b/src/main/org/apache/tools/zip/ZipFile.java index 6a85f770a..d59e8fa93 100644 --- a/src/main/org/apache/tools/zip/ZipFile.java +++ b/src/main/org/apache/tools/zip/ZipFile.java @@ -345,7 +345,15 @@ public class ZipFile { nameMap.put(ze.getName(), ze); - archive.skipBytes(extraLen); + int lenToSkip = extraLen; + while (lenToSkip > 0) { + int skipped = archive.skipBytes(lenToSkip); + if (skipped <= 0) { + throw new RuntimeException("failed to skip extra data in" + + " central directory"); + } + lenToSkip -= skipped; + } byte[] comment = new byte[commentLen]; archive.readFully(comment); @@ -461,7 +469,15 @@ public class ZipFile { int fileNameLen = ZipShort.getValue(b); archive.readFully(b); int extraFieldLen = ZipShort.getValue(b); - archive.skipBytes(fileNameLen); + int lenToSkip = fileNameLen; + while (lenToSkip > 0) { + int skipped = archive.skipBytes(lenToSkip); + if (skipped <= 0) { + throw new RuntimeException("failed to skip file name in" + + " local file header"); + } + lenToSkip -= skipped; + } byte[] localExtraData = new byte[extraFieldLen]; archive.readFully(localExtraData); ze.setExtra(localExtraData); diff --git a/src/main/org/apache/tools/zip/ZipLong.java b/src/main/org/apache/tools/zip/ZipLong.java index 677f95480..a6b5dda39 100644 --- a/src/main/org/apache/tools/zip/ZipLong.java +++ b/src/main/org/apache/tools/zip/ZipLong.java @@ -147,4 +147,13 @@ public final class ZipLong implements Cloneable { public int hashCode() { return (int) value; } + + public Object clone() { + try { + return (ZipLong) super.clone(); + } catch (CloneNotSupportedException cnfe) { + // impossible + throw new RuntimeException(cnfe); + } + } } diff --git a/src/main/org/apache/tools/zip/ZipShort.java b/src/main/org/apache/tools/zip/ZipShort.java index d75634932..da6ca490a 100644 --- a/src/main/org/apache/tools/zip/ZipShort.java +++ b/src/main/org/apache/tools/zip/ZipShort.java @@ -133,4 +133,13 @@ public final class ZipShort implements Cloneable { public int hashCode() { return value; } + + public Object clone() { + try { + return (ZipShort) super.clone(); + } catch (CloneNotSupportedException cnfe) { + // impossible + throw new RuntimeException(cnfe); + } + } } diff --git a/src/tests/junit/org/apache/tools/zip/AsiExtraFieldTest.java b/src/tests/junit/org/apache/tools/zip/AsiExtraFieldTest.java index c8e4fe418..fbfe06c94 100644 --- a/src/tests/junit/org/apache/tools/zip/AsiExtraFieldTest.java +++ b/src/tests/junit/org/apache/tools/zip/AsiExtraFieldTest.java @@ -138,4 +138,20 @@ public class AsiExtraFieldTest extends TestCase implements UnixStat { e.getMessage()); } } + + public void testClone() { + AsiExtraField s1 = new AsiExtraField(); + s1.setUserId(42); + s1.setGroupId(12); + s1.setLinkedFile("foo"); + s1.setMode(0644); + s1.setDirectory(true); + AsiExtraField s2 = (AsiExtraField) s1.clone(); + assertNotSame(s1, s2); + assertEquals(s1.getUserId(), s2.getUserId()); + assertEquals(s1.getGroupId(), s2.getGroupId()); + assertEquals(s1.getLinkedFile(), s2.getLinkedFile()); + assertEquals(s1.getMode(), s2.getMode()); + assertEquals(s1.isDirectory(), s2.isDirectory()); + } } diff --git a/src/tests/junit/org/apache/tools/zip/ZipLongTest.java b/src/tests/junit/org/apache/tools/zip/ZipLongTest.java index e72aaaaef..1b729900d 100644 --- a/src/tests/junit/org/apache/tools/zip/ZipLongTest.java +++ b/src/tests/junit/org/apache/tools/zip/ZipLongTest.java @@ -79,4 +79,11 @@ public class ZipLongTest extends TestCase { assertEquals(0x00000000FFFFFFFFl, zl.getValue()); } + public void testClone() { + ZipLong s1 = new ZipLong(42); + ZipLong s2 = (ZipLong) s1.clone(); + assertNotSame(s1, s2); + assertEquals(s1, s2); + assertEquals(s1.getValue(), s2.getValue()); + } } diff --git a/src/tests/junit/org/apache/tools/zip/ZipShortTest.java b/src/tests/junit/org/apache/tools/zip/ZipShortTest.java index 3fb604f7d..aff065dfc 100644 --- a/src/tests/junit/org/apache/tools/zip/ZipShortTest.java +++ b/src/tests/junit/org/apache/tools/zip/ZipShortTest.java @@ -77,4 +77,11 @@ public class ZipShortTest extends TestCase { assertEquals(0x0000FFFF, zs.getValue()); } + public void testClone() { + ZipShort s1 = new ZipShort(42); + ZipShort s2 = (ZipShort) s1.clone(); + assertNotSame(s1, s2); + assertEquals(s1, s2); + assertEquals(s1.getValue(), s2.getValue()); + } }