COMPRESS-200 use the backing array of the returned ByteBuffer properly
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/compress/trunk@1426319 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 919c7a0..19f40a4 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -69,6 +69,11 @@
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">
diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
index cb8e562..de140b4 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
@@ -22,6 +22,7 @@
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 @@
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 @@
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) {