Browse Source

ZipFile doesn't work properly for archives using unicode extra fields. Port of fix for COMPRESS-164 by Volker Leidl

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1210522 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 13 years ago
parent
commit
0e150acfd4
5 changed files with 31 additions and 4 deletions
  1. +1
    -0
      CONTRIBUTORS
  2. +3
    -0
      WHATSNEW
  3. +4
    -0
      contributors.xml
  4. +7
    -1
      src/main/org/apache/tools/zip/ZipFile.java
  5. +16
    -3
      src/tests/junit/org/apache/tools/zip/UTF8ZipFilesTest.java

+ 1
- 0
CONTRIBUTORS View File

@@ -356,6 +356,7 @@ Ulrich Schmidt
Valentino Miazzo Valentino Miazzo
Victor Toni Victor Toni
Vincent Legoll Vincent Legoll
Volker Leidl
Waldek Herka Waldek Herka
Will Wang Will Wang
William Bernardet William Bernardet


+ 3
- 0
WHATSNEW View File

@@ -112,6 +112,9 @@ Fixed bugs:
quoted. quoted.
Bugzilla Report 31667. Bugzilla Report 31667.


* ZipFile didn't work properly for archives using unicode extra
fields rather than UTF-8 filenames and the EFS-Flag.

Other changes: Other changes:
-------------- --------------




+ 4
- 0
contributors.xml View File

@@ -1436,6 +1436,10 @@
<first>Vincent</first> <first>Vincent</first>
<last>Legoll</last> <last>Legoll</last>
</name> </name>
<name>
<first>Volker</first>
<last>Leidl</last>
</name>
<name> <name>
<first>Will</first> <first>Will</first>
<last>Wang</last> <last>Wang</last>


+ 7
- 1
src/main/org/apache/tools/zip/ZipFile.java View File

@@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.zip.CRC32; import java.util.zip.CRC32;
import java.util.zip.Inflater; import java.util.zip.Inflater;
@@ -509,7 +510,7 @@ public class ZipFile {
*/ */
private void resolveLocalFileHeaderData(Map entriesWithoutUTF8Flag) private void resolveLocalFileHeaderData(Map entriesWithoutUTF8Flag)
throws IOException { throws IOException {
Enumeration e = getEntries();
Enumeration e = Collections.enumeration(new HashSet(entries.keySet()));
while (e.hasMoreElements()) { while (e.hasMoreElements()) {
ZipEntry ze = (ZipEntry) e.nextElement(); ZipEntry ze = (ZipEntry) e.nextElement();
OffsetEntry offsetEntry = (OffsetEntry) entries.get(ze); OffsetEntry offsetEntry = (OffsetEntry) entries.get(ze);
@@ -540,9 +541,14 @@ public class ZipFile {
+ SHORT + SHORT + fileNameLen + extraFieldLen; + SHORT + SHORT + fileNameLen + extraFieldLen;


if (entriesWithoutUTF8Flag.containsKey(ze)) { if (entriesWithoutUTF8Flag.containsKey(ze)) {
// changing the name of a ZipEntry is going to change
// the hashcode
// - see https://issues.apache.org/jira/browse/COMPRESS-164
entries.remove(ze);
setNameAndCommentFromExtraFields(ze, setNameAndCommentFromExtraFields(ze,
(NameAndComment) (NameAndComment)
entriesWithoutUTF8Flag.get(ze)); entriesWithoutUTF8Flag.get(ze));
entries.put(ze, offsetEntry);
} }
} }
} }


+ 16
- 3
src/tests/junit/org/apache/tools/zip/UTF8ZipFilesTest.java View File

@@ -19,6 +19,7 @@
package org.apache.tools.zip; package org.apache.tools.zip;


import java.io.File; import java.io.File;
import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
@@ -81,9 +82,9 @@ public class UTF8ZipFilesTest extends TestCase {
try { try {
createTestFile(file, US_ASCII, false, true); createTestFile(file, US_ASCII, false, true);
zf = new ZipFile(file, US_ASCII, true); zf = new ZipFile(file, US_ASCII, true);
assertNotNull(zf.getEntry(ASCII_TXT));
assertNotNull(zf.getEntry(EURO_FOR_DOLLAR_TXT));
assertNotNull(zf.getEntry(OIL_BARREL_TXT));
assertCanRead(zf, ASCII_TXT);
assertCanRead(zf, EURO_FOR_DOLLAR_TXT);
assertCanRead(zf, OIL_BARREL_TXT);
} finally { } finally {
ZipFile.closeQuietly(zf); ZipFile.closeQuietly(zf);
if (file.exists()) { if (file.exists()) {
@@ -232,5 +233,17 @@ public class UTF8ZipFilesTest extends TestCase {
} }
} }


private static void assertCanRead(ZipFile zf, String fileName) throws IOException {
ZipEntry entry = zf.getEntry(fileName);
assertNotNull("Entry " + fileName + " doesn't exist", entry);
InputStream is = zf.getInputStream(entry);
assertNotNull("InputStream is null", is);
try {
is.read();
} finally {
is.close();
}
}

} }



Loading…
Cancel
Save