diff --git a/WHATSNEW b/WHATSNEW index fefaf3504..e7edcb135 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -273,6 +273,9 @@ Other changes: * A wrapper script for OS/2 has been added. +* will now detect and successfully extract self-extracting + archives. Bugzilla Report 16213. + Changes from Ant 1.5.2 to Ant 1.5.3 =================================== diff --git a/src/etc/testcases/taskdefs/unzip.xml b/src/etc/testcases/taskdefs/unzip.xml index 824cf55a8..43c340395 100644 --- a/src/etc/testcases/taskdefs/unzip.xml +++ b/src/etc/testcases/taskdefs/unzip.xml @@ -63,4 +63,9 @@ + + + + + diff --git a/src/etc/testcases/taskdefs/zip/test.exe b/src/etc/testcases/taskdefs/zip/test.exe new file mode 100644 index 000000000..1372dffa3 Binary files /dev/null and b/src/etc/testcases/taskdefs/zip/test.exe differ diff --git a/src/main/org/apache/tools/ant/taskdefs/Expand.java b/src/main/org/apache/tools/ant/taskdefs/Expand.java index 788d30d8a..85848bd03 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Expand.java +++ b/src/main/org/apache/tools/ant/taskdefs/Expand.java @@ -56,14 +56,16 @@ package org.apache.tools.ant.taskdefs; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.RandomAccessFile; import java.io.FileOutputStream; -import java.io.IOException; +import java.io.FileNotFoundException; import java.io.InputStream; +import java.io.IOException; +import java.util.Arrays; import java.util.Date; import java.util.Vector; -import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import java.util.zip.ZipEntry; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; @@ -78,6 +80,7 @@ import org.apache.tools.ant.util.FileUtils; * @author costin@dnt.ro * @author Stefan Bodewig * @author Magesh Umasankar + * @author Jason Salter * * @since Ant 1.1 * @@ -92,6 +95,9 @@ public class Expand extends Task { private boolean overwrite = true; private Vector patternsets = new Vector(); private Vector filesets = new Vector(); + private static final byte[] ZIPMARKER = {0x50, 0x4b, 0x03, 0x04}; + private static final int MARKER_SIZE = ZIPMARKER.length; + private static final int MAX_LOOKAHEAD = 50 * 1024; // 50K. /** * Do the work. @@ -148,11 +154,34 @@ public class Expand extends Task { protected void expandFile(FileUtils fileUtils, File srcF, File dir) { log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO); ZipInputStream zis = null; + FileInputStream fis = null; + RandomAccessFile raf = null; + byte[] buff = new byte[MARKER_SIZE]; try { - // code from WarExpand - zis = new ZipInputStream(new FileInputStream(srcF)); - ZipEntry ze = null; + raf = new RandomAccessFile(srcF, "r"); + long offset = 0; + int more = raf.read(buff); + boolean foundMarker = false; + while (more != -1 || offset < MAX_LOOKAHEAD) { + if (Arrays.equals(buff, ZIPMARKER)) { + foundMarker = true; + break; + } + raf.seek(++offset); + more = raf.read(buff); + } + raf.close(); + raf = null; + fis = new FileInputStream(srcF); + if (foundMarker && offset > 0) { + log("found a preamble of " + offset + + " bytes, probably a self-extracting archive"); + fis.skip(offset); + } + + zis = new ZipInputStream(fis); + ZipEntry ze = null; while ((ze = zis.getNextEntry()) != null) { extractFile(fileUtils, srcF, dir, zis, ze.getName(), new Date(ze.getTime()), @@ -164,6 +193,11 @@ public class Expand extends Task { throw new BuildException("Error while expanding " + srcF.getPath(), ioe); } finally { + if (raf != null) { + try { + raf.close(); + } catch (IOException e) {} + } if (zis != null) { try { zis.close(); @@ -216,7 +250,6 @@ public class Expand extends Task { return; } } - File f = fileUtils.resolveFile(dir, entryName); try { if (!overwrite && f.exists() diff --git a/src/testcases/org/apache/tools/ant/taskdefs/UnzipTest.java b/src/testcases/org/apache/tools/ant/taskdefs/UnzipTest.java index 2abe2c3a3..638d22b66 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/UnzipTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/UnzipTest.java @@ -134,4 +134,13 @@ public class UnzipTest extends BuildFileTest { !getProject().resolveFile("unziptestout/2/bar").exists()); } + /* + * PR 16213 + */ + public void testSelfExtractingArchive() { + expectLogContaining("selfExtractingArchive", + "found a preamble of 38439 bytes, " + + "probably a self-extracting archive"); + } + }