Author: rgoers Date: Tue Nov 2 04:33:21 2010 New Revision: 1029951 URL: http://svn.apache.org/viewvc?rev=1029951&view=rev Log: Fix VFS-322 - Tar files can files over 2GB. Note that the unit test for this is slow and creates a 3GB file
Modified: commons/proper/vfs/trunk/core/pom.xml commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/tar/TarInputStream.java commons/proper/vfs/trunk/pom.xml commons/proper/vfs/trunk/src/changes/changes.xml Modified: commons/proper/vfs/trunk/core/pom.xml URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/pom.xml?rev=1029951&r1=1029950&r2=1029951&view=diff ============================================================================== --- commons/proper/vfs/trunk/core/pom.xml (original) +++ commons/proper/vfs/trunk/core/pom.xml Tue Nov 2 04:33:21 2010 @@ -51,12 +51,11 @@ <artifactId>commons-net</artifactId> <optional>true</optional> </dependency> - <!--TODO:Revert to [compress] if/when released <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> - <optional>true</optional> - </dependency--> + <scope>test</scope> + </dependency> <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> Modified: commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/tar/TarInputStream.java URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/tar/TarInputStream.java?rev=1029951&r1=1029950&r2=1029951&view=diff ============================================================================== --- commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/tar/TarInputStream.java (original) +++ commons/proper/vfs/trunk/core/src/main/java/org/apache/commons/vfs/provider/tar/TarInputStream.java Tue Nov 2 04:33:21 2010 @@ -40,7 +40,7 @@ class TarInputStream private TarEntry currEntry; private boolean debug; private int entryOffset; - private int entrySize; + private long entrySize; private boolean hasHitEOF; private byte[] oneBuf; private byte[] readBuf; @@ -122,7 +122,7 @@ class TarInputStream if (currEntry != null) { - final int numToSkip = entrySize - entryOffset; + final long numToSkip = entrySize - entryOffset; if (debug) { @@ -134,7 +134,8 @@ class TarInputStream if (numToSkip > 0) { - skip(numToSkip); + // Use our internal skip to move to the end of the current entry + longSkip(numToSkip); } readBuf = null; @@ -182,8 +183,7 @@ class TarInputStream entryOffset = 0; - // REVIEW How do we resolve this discrepancy?! - entrySize = (int) currEntry.getSize(); + entrySize = currEntry.getSize(); } if (null != currEntry && currEntry.isGNULongNameEntry()) @@ -235,7 +235,13 @@ class TarInputStream public int available() throws IOException { - return entrySize - entryOffset; + long remaining = entrySize - entryOffset; + + if(remaining > Integer.MAX_VALUE) { + return Integer.MAX_VALUE; + } + + return (int) remaining; } /** @@ -353,7 +359,7 @@ class TarInputStream if ((numToRead + entryOffset) > entrySize) { - numToRead = (entrySize - entryOffset); + numToRead = (int)(entrySize - entryOffset); } if (null != readBuf) @@ -428,6 +434,18 @@ class TarInputStream { } + public void longSkip(final long numToSkip) throws IOException { + for(long skipped = 0; skipped < numToSkip;) { + if(numToSkip - skipped > Integer.MAX_VALUE) { + skip((int)Integer.MAX_VALUE); + skipped += Integer.MAX_VALUE; + } else { + skip((int)(numToSkip - skipped)); + skipped += numToSkip - skipped; + } + } + } + /** * Skip bytes in the input buffer. This skips bytes in the current entry's * data, not the entire archive, and will stop at the end of the current Modified: commons/proper/vfs/trunk/pom.xml URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/pom.xml?rev=1029951&r1=1029950&r2=1029951&view=diff ============================================================================== --- commons/proper/vfs/trunk/pom.xml (original) +++ commons/proper/vfs/trunk/pom.xml Tue Nov 2 04:33:21 2010 @@ -301,7 +301,7 @@ <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> - <version>1.0</version> + <version>1.1</version> </dependency> <dependency> <groupId>org.apache.jackrabbit</groupId> Modified: commons/proper/vfs/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/vfs/trunk/src/changes/changes.xml?rev=1029951&r1=1029950&r2=1029951&view=diff ============================================================================== --- commons/proper/vfs/trunk/src/changes/changes.xml (original) +++ commons/proper/vfs/trunk/src/changes/changes.xml Tue Nov 2 04:33:21 2010 @@ -23,6 +23,9 @@ <body> <release version="2.0" date="in SVN" description=""> + <action dev="rgoers" type="fix" issue="VFS-322" due-to="Curtis Boyden"> + Allow tar files that contain files over 2GB in size. + </action> <action dev="rgoers" type="fix" issue="VFS-324" due-to="sebb"> Clear the cache in RamFileSystem and the children in RamFileData. </action>