Skip to content

Commit 10c52d2

Browse files
author
Plamen Totev
committed
Fix file mode handling for zip entries with non-Unix platform
Let's say you have a zip archive created under windows or with tool that does not support unix files modes. org.apache.commons.compress.archivers.zip.ZipArchiveEntry::getUnixMode will return 0 for any entry that does not have platform set to Unix. On the other hand ZipResource::getAttributes does not check for this case and will return 0 (this is valid Unix mode). As a result if you add zip archive using AbstractArchiver::addArchivedFileSet the resulting archive will have entries with file mode set to 0. That's quite bad because when unpacked on some Unix platforms the files will be accessible only by the root user. Instead ZipResource::getAttributes should return -1 so the rest of plexus-archiver code could handle the case properly and distinguish it from the 0 file mode. Add check in the ZipResource::getAttributes to properly handle non-Unix platform entries.
1 parent fc80ceb commit 10c52d2

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

src/main/java/org/codehaus/plexus/archiver/zip/ZipResource.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,15 @@ private static long getLastModofied( ZipArchiveEntry entry )
4545

4646
public synchronized PlexusIoResourceAttributes getAttributes()
4747
{
48-
int mode = entry.getUnixMode();
49-
if ( ( mode & UnixStat.FILE_FLAG ) == UnixStat.FILE_FLAG )
48+
int mode = -1;
49+
if (entry.getPlatform() == ZipArchiveEntry.PLATFORM_UNIX)
5050
{
51-
mode = mode & ~UnixStat.FILE_FLAG;
52-
}
53-
else
54-
{
55-
mode = mode & ~UnixStat.DIR_FLAG;
51+
mode = entry.getUnixMode();
52+
if ((mode & UnixStat.FILE_FLAG) == UnixStat.FILE_FLAG) {
53+
mode = mode & ~UnixStat.FILE_FLAG;
54+
} else {
55+
mode = mode & ~UnixStat.DIR_FLAG;
56+
}
5657
}
5758

5859
if ( attributes == null )

src/test/java/org/codehaus/plexus/archiver/zip/PlexusArchiverZipFileResourceCollectionTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package org.codehaus.plexus.archiver.zip;
22

33
import org.codehaus.plexus.PlexusTestCase;
4+
import org.codehaus.plexus.components.io.functions.ResourceAttributeSupplier;
45
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
56

67
import java.io.File;
8+
import java.io.IOException;
79
import java.io.InputStream;
10+
import java.util.HashMap;
811
import java.util.HashSet;
912
import java.util.Iterator;
13+
import java.util.Map;
1014
import java.util.Set;
1115

1216
public class PlexusArchiverZipFileResourceCollectionTest
@@ -33,4 +37,25 @@ public void testFilesWithIllegalHtmlChars()
3337
}
3438
}
3539

40+
public void testFileModes()
41+
throws IOException
42+
{
43+
File testZip = new File( getBasedir(), "src/test/resources/zeroFileMode/mixed-file-mode.zip" );
44+
Map<String, Integer> originalUnixModes = new HashMap<String, Integer>();
45+
originalUnixModes.put( "platform-fat", -1 );
46+
originalUnixModes.put( "zero-unix-mode", 0 );
47+
// ---xrw-r-- the crazy permissions are on purpose so we don't hit some default value
48+
originalUnixModes.put( "non-zero-unix-mode", 0164 );
49+
PlexusArchiverZipFileResourceCollection prc = new PlexusArchiverZipFileResourceCollection();
50+
prc.setFile( testZip );
51+
Iterator<PlexusIoResource> entries = prc.getEntries();
52+
while ( entries.hasNext() )
53+
{
54+
PlexusIoResource entry = entries.next();
55+
int entryUnixMode = ( (ResourceAttributeSupplier) entry ).getAttributes().getOctalMode();
56+
int originalUnixMode = (int) originalUnixModes.get( entry.getName() );
57+
assertEquals( originalUnixMode, entryUnixMode );
58+
}
59+
}
60+
3661
}
1.83 KB
Binary file not shown.

0 commit comments

Comments
 (0)