Author: bodewig Date: Thu Dec 27 20:54:42 2012 New Revision: 1426319 URL: http://svn.apache.org/viewvc?rev=1426319&view=rev Log: COMPRESS-200 use the backing array of the returned ByteBuffer properly
Modified: commons/proper/compress/trunk/src/changes/changes.xml commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java Modified: commons/proper/compress/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=1426319&r1=1426318&r2=1426319&view=diff ============================================================================== --- commons/proper/compress/trunk/src/changes/changes.xml (original) +++ commons/proper/compress/trunk/src/changes/changes.xml Thu Dec 27 20:54:42 2012 @@ -69,6 +69,11 @@ The <action> type attribute can be add,u dependency on it has now been marked optional so Compress itself can still be used in an OSGi context. </action> + <action type="fix" date="2012-12-27" issue="COMPRESS-200"> + When specifying the encoding explicitly TarArchiveOutputStream + would write unreadable names in GNU mode or even cause errors + in POSIX mode for file names longer than 66 characters. + </action> </release> <release version="1.4.1" date="2012-05-23" description="Release 1.4.1"> Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java?rev=1426319&r1=1426318&r2=1426319&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java Thu Dec 27 20:54:42 2012 @@ -22,6 +22,7 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.StringWriter; +import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; import org.apache.commons.compress.archivers.ArchiveEntry; @@ -266,9 +267,10 @@ public class TarArchiveOutputStream exte TarArchiveEntry entry = (TarArchiveEntry) archiveEntry; Map<String, String> paxHeaders = new HashMap<String, String>(); final String entryName = entry.getName(); - final byte[] nameBytes = encoding.encode(entryName).array(); + final ByteBuffer encodedName = encoding.encode(entryName); + final int nameLen = encodedName.limit() - encodedName.position(); boolean paxHeaderContainsPath = false; - if (nameBytes.length >= TarConstants.NAMELEN) { + if (nameLen >= TarConstants.NAMELEN) { if (longFileMode == LONGFILE_POSIX) { paxHeaders.put("path", entryName); @@ -279,9 +281,9 @@ public class TarArchiveOutputStream exte TarArchiveEntry longLinkEntry = new TarArchiveEntry(TarConstants.GNU_LONGLINK, TarConstants.LF_GNUTYPE_LONGNAME); - longLinkEntry.setSize(nameBytes.length + 1); // +1 for NUL + longLinkEntry.setSize(nameLen + 1); // +1 for NUL putArchiveEntry(longLinkEntry); - write(nameBytes); + write(encodedName.array(), encodedName.arrayOffset(), nameLen); write(0); // NUL terminator closeArchiveEntry(); } else if (longFileMode != LONGFILE_TRUNCATE) {