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
Victor Toni
Vincent Legoll
Volker Leidl
Waldek Herka
Will Wang
William Bernardet


+ 3
- 0
WHATSNEW View File

@@ -112,6 +112,9 @@ Fixed bugs:
quoted.
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:
--------------



+ 4
- 0
contributors.xml View File

@@ -1436,6 +1436,10 @@
<first>Vincent</first>
<last>Legoll</last>
</name>
<name>
<first>Volker</first>
<last>Leidl</last>
</name>
<name>
<first>Will</first>
<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.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.zip.CRC32;
import java.util.zip.Inflater;
@@ -509,7 +510,7 @@ public class ZipFile {
*/
private void resolveLocalFileHeaderData(Map entriesWithoutUTF8Flag)
throws IOException {
Enumeration e = getEntries();
Enumeration e = Collections.enumeration(new HashSet(entries.keySet()));
while (e.hasMoreElements()) {
ZipEntry ze = (ZipEntry) e.nextElement();
OffsetEntry offsetEntry = (OffsetEntry) entries.get(ze);
@@ -540,9 +541,14 @@ public class ZipFile {
+ SHORT + SHORT + fileNameLen + extraFieldLen;

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,
(NameAndComment)
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;

import java.io.File;
import java.io.InputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
@@ -81,9 +82,9 @@ public class UTF8ZipFilesTest extends TestCase {
try {
createTestFile(file, US_ASCII, false, 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 {
ZipFile.closeQuietly(zf);
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