You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2024/01/11 15:26:29 UTC

(commons-compress) branch master updated: [COMPRESS-655] Fix TAR directory entries being misinterpreted as files (#460)

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git


The following commit(s) were added to refs/heads/master by this push:
     new 45023ddcc [COMPRESS-655] Fix TAR directory entries being misinterpreted as files (#460)
45023ddcc is described below

commit 45023ddcc43e13804dff799ae96f2acce14ce3cd
Author: Sebastian Schuberth <ss...@users.noreply.github.com>
AuthorDate: Thu Jan 11 16:26:24 2024 +0100

    [COMPRESS-655] Fix TAR directory entries being misinterpreted as files (#460)
    
    * Add a failing test for COMPRESS-657
    
    * [COMPRESS-655] Fix TAR directory entries being misinterpreted as files
    
    Do not treat directory names without a trailing slash automatically as
    files.
---
 .../compress/archivers/tar/TarArchiveEntry.java       |   2 +-
 .../commons/compress/archivers/tar/TarFileTest.java   |  13 +++++++++++++
 src/test/resources/COMPRESS-657/README.md             |   5 +++++
 src/test/resources/COMPRESS-657/orjson-3.7.8.tar      | Bin 0 -> 1904128 bytes
 4 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
index 420537420..35f49d08a 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
@@ -1241,7 +1241,7 @@ public class TarArchiveEntry implements ArchiveEntry, TarConstants, EntryStreamO
         if (linkFlag == LF_OLDNORM || linkFlag == LF_NORMAL) {
             return true;
         }
-        return !getName().endsWith("/");
+        return linkFlag != LF_DIR && !getName().endsWith("/");
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/TarFileTest.java b/src/test/java/org/apache/commons/compress/archivers/tar/TarFileTest.java
index 2677fe9df..f66ee180e 100644
--- a/src/test/java/org/apache/commons/compress/archivers/tar/TarFileTest.java
+++ b/src/test/java/org/apache/commons/compress/archivers/tar/TarFileTest.java
@@ -17,6 +17,7 @@
 package org.apache.commons.compress.archivers.tar;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
@@ -111,6 +112,18 @@ public class TarFileTest extends AbstractTest {
         }
     }
 
+    @Test
+    public void testCompress657() throws IOException {
+        try (TarFile tarFile = new TarFile(getPath("COMPRESS-657/orjson-3.7.8.tar"))) {
+            for (final TarArchiveEntry entry : tarFile.getEntries()) {
+                if (entry.isDirectory()) {
+                    // An entry cannot be a directory and a "normal file" at the same time.
+                    assertFalse(entry.isFile(), "Entry '" + entry.getName() + "' is both a directory and a file");
+                }
+            }
+        }
+    }
+
     @Test
     public void testDatePriorToEpochInGNUFormat() throws Exception {
         datePriorToEpoch("preepoch-star.tar");
diff --git a/src/test/resources/COMPRESS-657/README.md b/src/test/resources/COMPRESS-657/README.md
new file mode 100644
index 000000000..784b1e08f
--- /dev/null
+++ b/src/test/resources/COMPRESS-657/README.md
@@ -0,0 +1,5 @@
+The `orjson-3.7.8.tar` test resource was originally downloaded from [1] and piped through `zcat` to turn it into a
+plain TAR as the GZ compression is not related to the bug. The *orjson* project is dual-licensed under Apache-2.0 or MIT, see [2]. 
+
+[1]: https://files.pythonhosted.org/packages/ac/4a/43daa65b7ed984612267983039a58703c48ccbc62561abb43ec7bc8b0663/orjson-3.7.8.tar.gz
+[2]: https://github.com/ijl/orjson/issues/448
diff --git a/src/test/resources/COMPRESS-657/orjson-3.7.8.tar b/src/test/resources/COMPRESS-657/orjson-3.7.8.tar
new file mode 100644
index 000000000..04a418f1f
Binary files /dev/null and b/src/test/resources/COMPRESS-657/orjson-3.7.8.tar differ