diff --git a/src/main/org/apache/tools/tar/TarInputStream.java b/src/main/org/apache/tools/tar/TarInputStream.java index c599aa126..fc486a904 100644 --- a/src/main/org/apache/tools/tar/TarInputStream.java +++ b/src/main/org/apache/tools/tar/TarInputStream.java @@ -275,6 +275,12 @@ public class TarInputStream extends FilterInputStream { longName.append(new String(buffer, 0, length)); } getNextEntry(); + + // remove trailing null terminator + if (longName.length() > 0 + && longName.charAt(longName.length() - 1) == 0) { + longName.deleteCharAt(longName.length() - 1); + } this.currEntry.setName(longName.toString()); } diff --git a/src/testcases/org/apache/tools/tar/TarRoundTripTest.java b/src/testcases/org/apache/tools/tar/TarRoundTripTest.java new file mode 100644 index 000000000..a3ded3196 --- /dev/null +++ b/src/testcases/org/apache/tools/tar/TarRoundTripTest.java @@ -0,0 +1,42 @@ +package org.apache.tools.tar; + +import java.io.IOException; +import java.io.ByteArrayOutputStream; +import junit.framework.TestCase; + +public class TarRoundTripTest extends TestCase { + + private static final String LONG_NAME + = "this/path/name/contains/more/than/one/hundred/characters/in/order/" + + "to/test/the/GNU/long/file/name/capability/round/tripped"; + + public TarRoundTripTest(String name) { + super(name); + } + + /** + * test round-tripping long (GNU) entries + */ + public void testLongRoundTripping() throws IOException { + TarEntry original = new TarEntry(LONG_NAME); + assertEquals("over 100 chars", true, LONG_NAME.length() > 100); + assertEquals("original name", LONG_NAME, original.getName()); + + + ByteArrayOutputStream buff = new ByteArrayOutputStream(); + TarOutputStream tos = new TarOutputStream(buff); + tos.setLongFileMode(TarOutputStream.LONGFILE_GNU); + tos.putNextEntry(original); + tos.closeEntry(); + tos.close(); + + TarInputStream tis + = new TarInputStream(new ByteArrayInputStream(buff.toByteArray())); + TarEntry tripped = tis.getNextEntry(); + assertEquals("round-tripped name", LONG_NAME, tripped.getName()); + assertNull("no more entries", tis.getNextEntry()); + tis.close(); + } +} + +