fe44045
From 291d0c218e256750228b731a693e6b96e7ed5449 Mon Sep 17 00:00:00 2001
fe44045
From: Martin Matuska <martin@matuska.org>
fe44045
Date: Fri, 22 May 2020 13:03:55 +0200
fe44045
Subject: [PATCH] test_write_disk_secure: properly check if lchmod() is
fe44045
fe44045
---
fe44045
 libarchive/test/test_write_disk_secure.c | 34 +++++++++++++++++++++---
fe44045
 1 file changed, 30 insertions(+), 4 deletions(-)
fe44045
fe44045
diff --git a/libarchive/test/test_write_disk_secure.c b/libarchive/test/test_write_disk_secure.c
fe44045
index 7cd66c4..44b9ea0 100644
fe44045
--- a/libarchive/test/test_write_disk_secure.c
fe44045
+++ b/libarchive/test/test_write_disk_secure.c
fe44045
@@ -40,6 +40,10 @@ DEFINE_TEST(test_write_disk_secure)
fe44045
 	struct archive *a;
fe44045
 	struct archive_entry *ae;
fe44045
 	struct stat st;
fe44045
+#if defined(HAVE_LCHMOD) && defined(HAVE_SYMLINK) && \
fe44045
+    defined(S_IRUSR) && defined(S_IWUSR) && defined(S_IXUSR)
fe44045
+	int working_lchmod;
fe44045
+#endif
fe44045
 
fe44045
 	/* Start with a known umask. */
fe44045
 	assertUmask(UMASK);
fe44045
@@ -251,10 +255,32 @@ DEFINE_TEST(test_write_disk_secure)
fe44045
 	assert(0 == lstat("link_to_dir", &st);;
fe44045
 	failure("link_to_dir: st.st_mode=%o", st.st_mode);
fe44045
 	assert(S_ISLNK(st.st_mode));
fe44045
-#if HAVE_LCHMOD
fe44045
-	/* Systems that lack lchmod() can't set symlink perms, so skip this. */
fe44045
-	failure("link_to_dir: st.st_mode=%o", st.st_mode);
fe44045
-	assert((st.st_mode & 07777) == 0755);
fe44045
+#if defined(HAVE_SYMLINK) && defined(HAVE_LCHMOD) && \
fe44045
+    defined(S_IRUSR) && defined(S_IWUSR) && defined(S_IXUSR)
fe44045
+	/* Verify if we are able to lchmod() */
fe44045
+	if (symlink("dir", "testlink_to_dir") == 0) {
fe44045
+		if (lchmod("testlink_to_dir",
fe44045
+		    S_IRUSR | S_IWUSR | S_IXUSR) != 0) {
fe44045
+			switch (errno) {
fe44045
+				case ENOTSUP:
fe44045
+				case ENOSYS:
fe44045
+#if ENOTSUP != EOPNOTSUPP
fe44045
+				case EOPNOTSUPP:
fe44045
+#endif
fe44045
+					working_lchmod = 0;
fe44045
+					break;
fe44045
+				default:
fe44045
+					working_lchmod = 1;
fe44045
+			}
fe44045
+		} else
fe44045
+			working_lchmod = 1;
fe44045
+	} else
fe44045
+		working_lchmod = 0;
fe44045
+
fe44045
+	if (working_lchmod) {
fe44045
+		failure("link_to_dir: st.st_mode=%o", st.st_mode);
fe44045
+		assert((st.st_mode & 07777) == 0755);
fe44045
+	}
fe44045
 #endif
fe44045
 
fe44045
 	assert(0 == lstat("dir/filea", &st);;
fe44045
-- 
fe44045
2.24.1
fe44045