Skip to content

Commit aa2a1f3

Browse files
tomdegoedecopybara-github
authored andcommitted
Fix ZipDecompressor windows 0x80 (file attribute normal)
Fixes bazelbuild#9236. On a rare occasion a zip file contains files with the 0x80 attribute. From https://docs.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants A file that does not have other attributes set. This attribute is valid only when used alone. Closes bazelbuild#15260. PiperOrigin-RevId: 442825326
1 parent b059011 commit aa2a1f3

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ private ZipDecompressor() {
5151
private static final int S_IFREG = 0100000;
5252
private static final int S_IFLNK = 0120000;
5353
private static final int EXECUTABLE_MASK = 0755;
54-
@VisibleForTesting
55-
static final int WINDOWS_DIRECTORY = 0x10;
56-
@VisibleForTesting
57-
static final int WINDOWS_FILE = 0x20;
54+
55+
// source: https://docs.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants
56+
@VisibleForTesting static final int WINDOWS_FILE_ATTRIBUTE_DIRECTORY = 0x10;
57+
@VisibleForTesting static final int WINDOWS_FILE_ATTRIBUTE_ARCHIVE = 0x20;
58+
@VisibleForTesting static final int WINDOWS_FILE_ATTRIBUTE_NORMAL = 0x80;
5859

5960
/**
6061
* This unzips the zip file to directory {@link DecompressorDescriptor#repositoryPath()}, which by
@@ -186,10 +187,13 @@ static int getPermissions(int permissions, String path) throws IOException {
186187
// https://github.com/miloyip/rapidjson/archive/v1.0.2.zip, it looks like executables end up
187188
// with "normal" (posix) permissions (oddly), so they'll be handled above.
188189
int windowsPermission = permissions & 0xff;
189-
if ((windowsPermission & WINDOWS_DIRECTORY) == WINDOWS_DIRECTORY) {
190+
if ((windowsPermission & WINDOWS_FILE_ATTRIBUTE_DIRECTORY)
191+
== WINDOWS_FILE_ATTRIBUTE_DIRECTORY) {
190192
// Directory.
191193
return S_IFDIR | EXECUTABLE_MASK;
192-
} else if (permissions == 0 || (windowsPermission & WINDOWS_FILE) == WINDOWS_FILE) {
194+
} else if (permissions == 0
195+
|| (windowsPermission & WINDOWS_FILE_ATTRIBUTE_ARCHIVE) == WINDOWS_FILE_ATTRIBUTE_ARCHIVE
196+
|| (windowsPermission & WINDOWS_FILE_ATTRIBUTE_NORMAL) == WINDOWS_FILE_ATTRIBUTE_NORMAL) {
193197
// File.
194198
return S_IFREG | EXECUTABLE_MASK;
195199
}

src/test/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressorTest.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,14 @@ public void testGetPermissions() throws Exception {
8585

8686
@Test
8787
public void testWindowsPermissions() throws Exception {
88-
int permissions = ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_DIRECTORY, "foo/bar");
88+
int permissions =
89+
ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_FILE_ATTRIBUTE_DIRECTORY, "foo/bar");
8990
assertThat(permissions).isEqualTo(DIRECTORY);
90-
permissions = ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_FILE, "foo/bar");
91+
permissions =
92+
ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_FILE_ATTRIBUTE_ARCHIVE, "foo/bar");
93+
assertThat(permissions).isEqualTo(EXECUTABLE);
94+
permissions =
95+
ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_FILE_ATTRIBUTE_NORMAL, "foo/bar");
9196
assertThat(permissions).isEqualTo(EXECUTABLE);
9297
}
9398

0 commit comments

Comments
 (0)