File gradle-CVE-2023-35947.patch of Package gradle.36305

Patch for CVE-2023-35947 (bsc#1212931) gradle: unpacking Tar
archives could create files outside of the unpack location

Derived from upstream commits
1096b309520a8c315e3b6109a6526de4eabcb879 and
2e5c34d57d0c0b7f0e8b039a192b91e5c8249d91 

With this patch, Gradle will refuse to handle Tar archives which
contain path traversal elements in a Tar entry name. This resolves
CVE-2023-35947.

---
--- a/subprojects/core/src/main/java/org/gradle/api/internal/file/archive/TarFileTree.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/file/archive/TarFileTree.java
@@ -231,6 +231,10 @@ public class TarFileTree implements Mini
         public int getMode() {
             return entry.getMode() & 0777;
         }
+
+	protected String getEntryName() {
+            return entry.getName();
+        }
     }
 
     private static class NoCloseTarInputStream extends TarInputStream {
--- a/subprojects/core/src/main/java/org/gradle/api/internal/file/archive/ZipFileTree.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/file/archive/ZipFileTree.java
@@ -135,6 +135,10 @@ public class ZipFileTree implements Mini
             return String.format("zip entry %s!%s", originalFile, entry.getName());
         }
 
+	protected String getEntryName() {
+            return entry.getName();
+        }
+
         public void stopVisiting() {
             stopFlag.set(true);
         }
--- a/subprojects/core/src/main/java/org/gradle/caching/internal/tasks/TarTaskOutputPacker.java
+++ b/subprojects/core/src/main/java/org/gradle/caching/internal/tasks/TarTaskOutputPacker.java
@@ -46,6 +46,7 @@ import org.gradle.caching.internal.tasks
 import org.gradle.internal.hash.HashCode;
 import org.gradle.internal.hash.StreamHasher;
 import org.gradle.internal.nativeplatform.filesystem.FileSystem;
+import org.gradle.wrapper.PathTraversalChecker;
 
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
@@ -258,7 +259,7 @@ public class TarTaskOutputPacker impleme
         long entries = 0;
         while ((tarEntry = tarInput.getNextTarEntry()) != null) {
             ++entries;
-            String name = tarEntry.getName();
+            String name = safeEntryName(tarEntry);
 
             if (name.equals(METADATA_PATH)) {
                 // handle origin metadata
@@ -288,6 +289,14 @@ public class TarTaskOutputPacker impleme
         return new UnpackResult(originMetadata, entries, propertyFileSnapshots.build());
     }
 
+    /**
+     * Returns a safe name for the name of a tar archive entry.
+     *
+     */
+    private static String safeEntryName(TarArchiveEntry tarEntry) {
+        return PathTraversalChecker.safePathName(tarEntry.getName());
+    }
+
     private void unpackPropertyEntry(ResolvedTaskOutputFilePropertySpec propertySpec, InputStream input, TarArchiveEntry entry, String childPath, boolean missing, ImmutableMultimap.Builder<String, FileSnapshot> fileSnapshots) throws IOException {
         File propertyRoot = propertySpec.getOutputFile();
         String propertyName = propertySpec.getPropertyName();
openSUSE Build Service is sponsored by