merge revision 741089 from Ant trunk - fix for various findbugs issues - [SANDBOX-246]

git-svn-id: https://svn.apache.org/repos/asf/commons/sandbox/compress/trunk@741092 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarInputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarInputStream.java
index bf05051..735e7f8 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarInputStream.java
@@ -218,8 +218,13 @@
                         + 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/java/org/apache/commons/compress/archivers/tar/TarOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarOutputStream.java
index 8587d36..9d93eea 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarOutputStream.java
@@ -305,7 +305,7 @@
 
                 wOffset += numToWrite;
                 assemLen += numToWrite;
-                numToWrite -= numToWrite;
+                numToWrite = 0;
             }
         }
 
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/AsiExtraField.java b/src/main/java/org/apache/commons/compress/archivers/zip/AsiExtraField.java
index f192246..094a198 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/AsiExtraField.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/AsiExtraField.java
@@ -334,4 +334,14 @@
         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/java/org/apache/commons/compress/archivers/zip/UnrecognizedExtraField.java b/src/main/java/org/apache/commons/compress/archivers/zip/UnrecognizedExtraField.java
index 2d146ae..9ddc7a5 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/UnrecognizedExtraField.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/UnrecognizedExtraField.java
@@ -57,7 +57,7 @@
      */
     public void setCentralDirectoryData( final byte[] centralData )
     {
-        m_centralData = centralData;
+        m_centralData = copy(centralData);
     }
 
        /**
@@ -77,7 +77,7 @@
      */
     public void setLocalFileDataData( final byte[] localData )
     {
-        m_localData = localData;
+        m_localData = copy(localData);
     }
 
     /**
@@ -89,7 +89,7 @@
     {
         if( m_centralData != null )
         {
-            return m_centralData;
+            return copy(m_centralData);
         }
         return getLocalFileDataData();
     }
@@ -125,7 +125,7 @@
      */
     public byte[] getLocalFileDataData()
     {
-        return m_localData;
+        return copy(m_localData);
     }
 
     /**
@@ -153,4 +153,13 @@
         System.arraycopy( buffer, offset, fileData, 0, length );
         setLocalFileDataData( fileData );
     }
+
+    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/java/org/apache/commons/compress/archivers/zip/ZipFile.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
index f3e625e..d29e4e7 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
@@ -344,7 +344,15 @@
 
             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);
@@ -460,7 +468,15 @@
             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/java/org/apache/commons/compress/archivers/zip/ZipLong.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipLong.java
index 01c5f27..5621b00 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipLong.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipLong.java
@@ -146,4 +146,13 @@
     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/java/org/apache/commons/compress/archivers/zip/ZipShort.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipShort.java
index 55cc797..1bda55d 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipShort.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipShort.java
@@ -132,4 +132,13 @@
     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/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorOutputStream.java b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorOutputStream.java
index a615245..d6deeb9 100644
--- a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2CompressorOutputStream.java
@@ -614,7 +614,7 @@
                 }
 
                 if (ge > gs && nPart != nGroups && nPart != 1
-                    && ((nGroups - nPart) % 2 == 1)) {
+                    && ((nGroups - nPart) % 2 != 0)) {
                     aFreq -= mtfFreq[ge];
                     ge--;
                 }
@@ -984,9 +984,7 @@
             b = t;
         }
         if (b > c) {
-            t = b;
             b = c;
-            c = t;
         }
         if (a > b) {
             b = a;
@@ -1031,7 +1029,7 @@
 
             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;