]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
RAR5 reader: set correct mode for readonly directories
authorMartin Matuska <martin@matuska.org>
Thu, 9 May 2019 21:46:22 +0000 (23:46 +0200)
committerMartin Matuska <martin@matuska.org>
Thu, 9 May 2019 22:00:17 +0000 (00:00 +0200)
Fix shadowed declaration in processing fflags

libarchive/archive_read_support_format_rar5.c
libarchive/archive_write_disk_windows.c
libarchive/test/test_read_format_rar5.c

index 9d3f42e6d9b5affc0c9178006c69b3806b00a544..0b35112488925c99b4c951093f53fa83237e2374 100644 (file)
@@ -1675,7 +1675,11 @@ static int process_head_file(struct archive_read* a, struct rar5* rar,
                __LA_MODE_T mode;
 
                if(file_attr & ATTR_DIRECTORY) {
-                       mode = 0755 | AE_IFDIR;
+                       if (file_attr & ATTR_READONLY) {
+                               mode = 0555 | AE_IFDIR;
+                       } else {
+                               mode = 0755 | AE_IFDIR;
+                       }
                } else {
                        if (file_attr & ATTR_READONLY) {
                                mode = 0444 | AE_IFREG;
@@ -1687,26 +1691,26 @@ static int process_head_file(struct archive_read* a, struct rar5* rar,
                archive_entry_set_mode(entry, mode);
 
                if (file_attr & (ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM)) {
-                       char *fflags_text, *p;
+                       char *fflags_text, *ptr;
                        /* allocate for "rdonly,hidden,system," */
                        fflags_text = malloc(22 * sizeof(char));
                        if (fflags_text != NULL) {
-                               p = fflags_text;
+                               ptr = fflags_text;
                                if (file_attr & ATTR_READONLY) {
-                                       strcpy(p, "rdonly,");
-                                       p = p + 7;
+                                       strcpy(ptr, "rdonly,");
+                                       ptr = ptr + 7;
                                }
                                if (file_attr & ATTR_HIDDEN) {
-                                       p = strcpy(p, "hidden,");
-                                       p = p + 7;
+                                       strcpy(ptr, "hidden,");
+                                       ptr = ptr + 7;
                                }
                                if (file_attr & ATTR_SYSTEM) {
-                                       p = strcpy(p, "system,");
-                                       p = p + 7;
+                                       strcpy(ptr, "system,");
+                                       ptr = ptr + 7;
                                }
-                               if (p > fflags_text) {
+                               if (ptr > fflags_text) {
                                        /* Delete trailing comma */
-                                       *(p - 1) = '\0';
+                                       *(ptr - 1) = '\0';
                                        archive_entry_copy_fflags_text(entry,
                                            fflags_text);
                                }
index bc10a619e8a145ea7fbd11cecf536b7da3edf684..3d4d577f081f2b6513534a8d07e7bc190e24f627 100644 (file)
@@ -1811,11 +1811,8 @@ _archive_write_disk_close(struct archive *_a)
                            p->mtime, p->mtime_nanos,
                            p->ctime, p->ctime_nanos);
                }
-               if (p->fixup & TODO_MODE_BASE) {
-                       /* fflags have higher priority than mode */
-                       if ((p->fflags_set & FILE_ATTRIBUTE_READONLY) == 0)
-                               la_chmod(p->name, p->mode);
-               }
+               if (p->fixup & TODO_MODE_BASE)
+                       la_chmod(p->name, p->mode);
                if (p->fixup & TODO_ACLS)
                        set_acls(a, INVALID_HANDLE_VALUE, p->name, &p->acl);
                if (p->fixup & TODO_FFLAGS)
index 6e0b7a52f062740080a1aedf74c0fdffa2b4bc33..fe2661de13c32c157b9c3f8b2f01332c7e0fb59c 100644 (file)
@@ -1096,7 +1096,7 @@ DEFINE_TEST(test_read_format_rar5_fileattr)
        PROLOGUE("test_read_format_rar5_fileattr.rar");
 
        assertA(0 == archive_read_next_header(a, &ae));
-       assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+       assertEqualInt(archive_entry_mode(ae), 0444 | AE_IFREG);
        assertEqualString("readonly.txt", archive_entry_pathname(ae));
        assertEqualString("rdonly", archive_entry_fflags_text(ae));
        archive_entry_fflags(ae, &set, &clear);
@@ -1108,7 +1108,7 @@ DEFINE_TEST(test_read_format_rar5_fileattr)
        assertEqualInt(flag, set & flag);
 
        assertA(0 == archive_read_next_header(a, &ae));
-       assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+       assertEqualInt(archive_entry_mode(ae), 0644 | AE_IFREG);
        assertEqualString("hidden.txt", archive_entry_pathname(ae));
        assertEqualString("hidden", archive_entry_fflags_text(ae));
        archive_entry_fflags(ae, &set, &clear);
@@ -1120,7 +1120,7 @@ DEFINE_TEST(test_read_format_rar5_fileattr)
        assertEqualInt(flag, set & flag);
 
        assertA(0 == archive_read_next_header(a, &ae));
-       assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+       assertEqualInt(archive_entry_mode(ae), 0644 | AE_IFREG);
        assertEqualString("system.txt", archive_entry_pathname(ae));
        assertEqualString("system", archive_entry_fflags_text(ae));
        archive_entry_fflags(ae, &set, &clear);
@@ -1132,7 +1132,7 @@ DEFINE_TEST(test_read_format_rar5_fileattr)
        assertEqualInt(flag, set & flag);
 
        assertA(0 == archive_read_next_header(a, &ae));
-       assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+       assertEqualInt(archive_entry_mode(ae), 0444 | AE_IFREG);
        assertEqualString("ro_hidden.txt", archive_entry_pathname(ae));
        assertEqualString("rdonly,hidden", archive_entry_fflags_text(ae));
        archive_entry_fflags(ae, &set, &clear);
@@ -1144,7 +1144,7 @@ DEFINE_TEST(test_read_format_rar5_fileattr)
        assertEqualInt(flag, set & flag);
 
        assertA(0 == archive_read_next_header(a, &ae));
-       assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualInt(archive_entry_mode(ae), 0555 | AE_IFDIR);
        assertEqualString("dir_readonly", archive_entry_pathname(ae));
        assertEqualString("rdonly", archive_entry_fflags_text(ae));
        archive_entry_fflags(ae, &set, &clear);
@@ -1156,7 +1156,7 @@ DEFINE_TEST(test_read_format_rar5_fileattr)
        assertEqualInt(flag, set & flag);
 
        assertA(0 == archive_read_next_header(a, &ae));
-       assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualInt(archive_entry_mode(ae), 0755 | AE_IFDIR);
        assertEqualString("dir_hidden", archive_entry_pathname(ae));
        assertEqualString("hidden", archive_entry_fflags_text(ae));
        archive_entry_fflags(ae, &set, &clear);
@@ -1168,7 +1168,7 @@ DEFINE_TEST(test_read_format_rar5_fileattr)
        assertEqualInt(flag, set & flag);
 
        assertA(0 == archive_read_next_header(a, &ae));
-       assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualInt(archive_entry_mode(ae), 0755 | AE_IFDIR);
        assertEqualString("dir_system", archive_entry_pathname(ae));
        assertEqualString("system", archive_entry_fflags_text(ae));
        archive_entry_fflags(ae, &set, &clear);
@@ -1180,7 +1180,7 @@ DEFINE_TEST(test_read_format_rar5_fileattr)
        assertEqualInt(flag, set & flag);
 
        assertA(0 == archive_read_next_header(a, &ae));
-       assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualInt(archive_entry_mode(ae), 0555 | AE_IFDIR);
        assertEqualString("dir_rohidden", archive_entry_pathname(ae));
        assertEqualString("rdonly,hidden", archive_entry_fflags_text(ae));
        archive_entry_fflags(ae, &set, &clear);