summaryrefslogtreecommitdiffstats
path: root/lib/libarchive/test/test_read_extract.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libarchive/test/test_read_extract.c')
-rw-r--r--lib/libarchive/test/test_read_extract.c27
1 files changed, 18 insertions, 9 deletions
diff --git a/lib/libarchive/test/test_read_extract.c b/lib/libarchive/test/test_read_extract.c
index 5a32eed..da23a8c 100644
--- a/lib/libarchive/test/test_read_extract.c
+++ b/lib/libarchive/test/test_read_extract.c
@@ -135,12 +135,18 @@ DEFINE_TEST(test_read_extract)
#endif
/* Test the entries on disk. */
+ /* This first entry was extracted with ARCHIVE_EXTRACT_PERM,
+ * so the permissions should have been restored exactly,
+ * including resetting the gid bit on those platforms
+ * where gid is inherited by subdirs. */
assert(0 == stat("dir_0775", &st));
failure("This was 0775 in archive, and should be 0775 on disk");
- assert(st.st_mode == (S_IFDIR | 0775));
+ assertEqualInt(st.st_mode, S_IFDIR | 0775);
+ /* Everything else was extracted without ARCHIVE_EXTRACT_PERM,
+ * so there may be some sloppiness about gid bits on directories. */
assert(0 == stat("file", &st));
failure("st.st_mode=%o should be %o", st.st_mode, S_IFREG | 0755);
- assert(st.st_mode == (S_IFREG | 0755));
+ assertEqualInt(st.st_mode, S_IFREG | 0755);
failure("The file extracted to disk is the wrong size.");
assert(st.st_size == FILE_BUFF_SIZE);
fd = open("file", O_RDONLY);
@@ -153,23 +159,26 @@ DEFINE_TEST(test_read_extract)
assert(memcmp(buff, file_buff, FILE_BUFF_SIZE) == 0);
assert(0 == stat("dir", &st));
failure("This was 0777 in archive, but umask should make it 0755");
- assert(st.st_mode == (S_IFDIR | 0755));
+ /* If EXTRACT_PERM wasn't used, be careful to ignore sgid bit
+ * when checking dir modes, as some systems inherit sgid bit
+ * from the parent dir. */
+ assertEqualInt(0755, st.st_mode & 0777);
assert(0 == stat("dir/file", &st));
assert(st.st_mode == (S_IFREG | 0700));
assert(0 == stat("dir2", &st));
- assert(st.st_mode == (S_IFDIR | 0755));
+ assertEqualInt(0755, st.st_mode & 0777);
assert(0 == stat("dir2/file", &st));
assert(st.st_mode == (S_IFREG | 0000));
assert(0 == stat("dir3", &st));
- assert(st.st_mode == (S_IFDIR | 0710));
+ assertEqualInt(0710, st.st_mode & 0777);
assert(0 == stat("dir4", &st));
- assert(st.st_mode == (S_IFDIR | 0755));
+ assertEqualInt(0755, st.st_mode & 0777);
assert(0 == stat("dir4/a", &st));
- assert(st.st_mode == (S_IFDIR | 0755));
+ assertEqualInt(0755, st.st_mode & 0777);
assert(0 == stat("dir4/b", &st));
- assert(st.st_mode == (S_IFDIR | 0755));
+ assertEqualInt(0755, st.st_mode & 0777);
assert(0 == stat("dir4/c", &st));
- assert(st.st_mode == (S_IFDIR | 0711));
+ assertEqualInt(0711, st.st_mode & 0777);
assert(0 == lstat("symlink", &st));
assert(S_ISLNK(st.st_mode));
#if HAVE_LCHMOD
OpenPOWER on IntegriCloud