]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
When opening directories, use O_EXEC flag only on FreeBSD
authorMartin Matuska <martin@matuska.org>
Tue, 19 Nov 2019 15:50:27 +0000 (16:50 +0100)
committerMartin Matuska <martin@matuska.org>
Tue, 19 Nov 2019 15:50:27 +0000 (16:50 +0100)
Fixes #1279

libarchive/archive_read_disk_posix.c
libarchive/archive_write_disk_posix.c
libarchive/test/test_read_disk_directory_traversals.c

index f62d182e8db21892501e79e0dd638b6b9861fdd5..183ca1e8790d7ac0abd5fe17c470c7bd83212279 100644 (file)
@@ -2173,7 +2173,7 @@ tree_reopen(struct tree *t, const char *path, int restore_time)
 #elif defined(O_SEARCH)
        /* SunOS */
        const int o_flag = O_SEARCH;
-#elif defined(O_EXEC)
+#elif defined(__FreeBSD__) && defined(O_EXEC)
        /* FreeBSD */
        const int o_flag = O_EXEC;
 #endif
@@ -2199,7 +2199,8 @@ tree_reopen(struct tree *t, const char *path, int restore_time)
        t->stack->flags = needsFirstVisit;
        t->maxOpenCount = t->openCount = 1;
        t->initial_dir_fd = open(".", O_RDONLY | O_CLOEXEC);
-#if defined(O_PATH) || defined(O_SEARCH) || defined(O_EXEC)
+#if defined(O_PATH) || defined(O_SEARCH) || \
+ (defined(__FreeBSD__) && defined(O_EXEC))
        /*
         * Most likely reason to fail opening "." is that it's not readable,
         * so try again for execute. The consequences of not opening this are
index 6ae8a6a89bbf446b5da5a16b45fa451900552836..df4b02f5efa13871fb35c89e44ae3e696c0c9da1 100644 (file)
@@ -419,7 +419,7 @@ la_opendirat(int fd, const char *path) {
            | O_PATH
 #elif defined(O_SEARCH)
            | O_SEARCH
-#elif defined(O_EXEC)
+#elif defined(__FreeBSD__) && defined(O_EXEC)
            | O_EXEC
 #else
            | O_RDONLY
index 7dd19157d4d21077df2da429e3f46e13809facf8..bbfe91ab8e5ee0ce3ef0bf2031073f4aab2a08e8 100644 (file)
@@ -1775,7 +1775,8 @@ test_parent(void)
        archive_entry_clear(ae);
        r = archive_read_next_header2(a, ae);
        if (r == ARCHIVE_FAILED) {
-#if defined(O_PATH) || defined(O_SEARCH) || defined(O_EXEC)
+#if defined(O_PATH) || defined(O_SEARCH) || \
+ (defined(__FreeBSD__) && defined(O_EXEC))
                assertEqualIntA(a, ARCHIVE_OK, r);
 #endif
                /* Close the disk object. */