From 56e24170565709c603ee97c25a08b5943949e71b Mon Sep 17 00:00:00 2001 From: Tom de Goede Date: Thu, 14 Apr 2022 20:39:25 +0200 Subject: [PATCH 1/2] Fix ZipDecompressor windows 0x80 (file attribute normal) --- .../lib/bazel/repository/ZipDecompressor.java | 15 +++++++++++---- .../lib/bazel/repository/ZipDecompressorTest.java | 6 ++++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java index 30f59f3b957f70..50555ef96c82cc 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java @@ -51,10 +51,14 @@ private ZipDecompressor() { private static final int S_IFREG = 0100000; private static final int S_IFLNK = 0120000; private static final int EXECUTABLE_MASK = 0755; + + // source: https://docs.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants + @VisibleForTesting + static final int WINDOWS_FILE_ATTRIBUTE_DIRECTORY = 0x10; @VisibleForTesting - static final int WINDOWS_DIRECTORY = 0x10; + static final int WINDOWS_FILE_ATTRIBUTE_ARCHIVE = 0x20; @VisibleForTesting - static final int WINDOWS_FILE = 0x20; + static final int WINDOWS_FILE_ATTRIBUTE_NORMAL = 0x80; /** * This unzips the zip file to directory {@link DecompressorDescriptor#repositoryPath()}, which by @@ -186,10 +190,13 @@ static int getPermissions(int permissions, String path) throws IOException { // https://github.com/miloyip/rapidjson/archive/v1.0.2.zip, it looks like executables end up // with "normal" (posix) permissions (oddly), so they'll be handled above. int windowsPermission = permissions & 0xff; - if ((windowsPermission & WINDOWS_DIRECTORY) == WINDOWS_DIRECTORY) { + if ((windowsPermission & WINDOWS_FILE_ATTRIBUTE_DIRECTORY) == WINDOWS_FILE_ATTRIBUTE_DIRECTORY) { // Directory. return S_IFDIR | EXECUTABLE_MASK; - } else if (permissions == 0 || (windowsPermission & WINDOWS_FILE) == WINDOWS_FILE) { + } else if (permissions == 0 || (windowsPermission & WINDOWS_FILE_ATTRIBUTE_ARCHIVE) == WINDOWS_FILE_ATTRIBUTE_ARCHIVE) { + // File. + return S_IFREG | EXECUTABLE_MASK; + } else if (permissions == 0 || (windowsPermission & WINDOWS_FILE_ATTRIBUTE_NORMAL) == WINDOWS_FILE_ATTRIBUTE_NORMAL) { // File. return S_IFREG | EXECUTABLE_MASK; } diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressorTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressorTest.java index 0ba47de9014a9e..37a23e362afa2f 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressorTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressorTest.java @@ -85,9 +85,11 @@ public void testGetPermissions() throws Exception { @Test public void testWindowsPermissions() throws Exception { - int permissions = ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_DIRECTORY, "foo/bar"); + int permissions = ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_FILE_ATTRIBUTE_DIRECTORY, "foo/bar"); assertThat(permissions).isEqualTo(DIRECTORY); - permissions = ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_FILE, "foo/bar"); + permissions = ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_FILE_ATTRIBUTE_ARCHIVE, "foo/bar"); + assertThat(permissions).isEqualTo(EXECUTABLE); + permissions = ZipDecompressor.getPermissions(ZipDecompressor.WINDOWS_FILE_ATTRIBUTE_NORMAL, "foo/bar"); assertThat(permissions).isEqualTo(EXECUTABLE); } From fd55f574e0fc6385a412cea942867ce72178da54 Mon Sep 17 00:00:00 2001 From: Tom de Goede Date: Tue, 19 Apr 2022 16:34:25 +0200 Subject: [PATCH 2/2] Merge if statements --- .../build/lib/bazel/repository/ZipDecompressor.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java index 50555ef96c82cc..18ba6286addb15 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/ZipDecompressor.java @@ -193,10 +193,9 @@ static int getPermissions(int permissions, String path) throws IOException { if ((windowsPermission & WINDOWS_FILE_ATTRIBUTE_DIRECTORY) == WINDOWS_FILE_ATTRIBUTE_DIRECTORY) { // Directory. return S_IFDIR | EXECUTABLE_MASK; - } else if (permissions == 0 || (windowsPermission & WINDOWS_FILE_ATTRIBUTE_ARCHIVE) == WINDOWS_FILE_ATTRIBUTE_ARCHIVE) { - // File. - return S_IFREG | EXECUTABLE_MASK; - } else if (permissions == 0 || (windowsPermission & WINDOWS_FILE_ATTRIBUTE_NORMAL) == WINDOWS_FILE_ATTRIBUTE_NORMAL) { + } else if (permissions == 0 || + (windowsPermission & WINDOWS_FILE_ATTRIBUTE_ARCHIVE) == WINDOWS_FILE_ATTRIBUTE_ARCHIVE || + (windowsPermission & WINDOWS_FILE_ATTRIBUTE_NORMAL) == WINDOWS_FILE_ATTRIBUTE_NORMAL) { // File. return S_IFREG | EXECUTABLE_MASK; }