From 16ad251f0ac04219cd3b2a90b04060da1c98838f Mon Sep 17 00:00:00 2001 From: Martin Matuska Date: Tue, 19 Nov 2019 16:50:27 +0100 Subject: [PATCH] When opening directories, use O_EXEC flag only on FreeBSD Fixes #1279 --- libarchive/archive_read_disk_posix.c | 5 +++-- libarchive/archive_write_disk_posix.c | 2 +- libarchive/test/test_read_disk_directory_traversals.c | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libarchive/archive_read_disk_posix.c b/libarchive/archive_read_disk_posix.c index f62d182e8..183ca1e87 100644 --- a/libarchive/archive_read_disk_posix.c +++ b/libarchive/archive_read_disk_posix.c @@ -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 diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c index 6ae8a6a89..df4b02f5e 100644 --- a/libarchive/archive_write_disk_posix.c +++ b/libarchive/archive_write_disk_posix.c @@ -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 diff --git a/libarchive/test/test_read_disk_directory_traversals.c b/libarchive/test/test_read_disk_directory_traversals.c index 7dd19157d..bbfe91ab8 100644 --- a/libarchive/test/test_read_disk_directory_traversals.c +++ b/libarchive/test/test_read_disk_directory_traversals.c @@ -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. */ -- 2.47.2