From: Martin Matuska Date: Thu, 9 May 2019 21:46:22 +0000 (+0200) Subject: RAR5 reader: set correct mode for readonly directories X-Git-Tag: v3.4.0~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1d99c3ec12ff5e59eb81d28f450226146344183b;p=thirdparty%2Flibarchive.git RAR5 reader: set correct mode for readonly directories Fix shadowed declaration in processing fflags --- diff --git a/libarchive/archive_read_support_format_rar5.c b/libarchive/archive_read_support_format_rar5.c index 9d3f42e6d..0b3511248 100644 --- a/libarchive/archive_read_support_format_rar5.c +++ b/libarchive/archive_read_support_format_rar5.c @@ -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); } diff --git a/libarchive/archive_write_disk_windows.c b/libarchive/archive_write_disk_windows.c index bc10a619e..3d4d577f0 100644 --- a/libarchive/archive_write_disk_windows.c +++ b/libarchive/archive_write_disk_windows.c @@ -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) diff --git a/libarchive/test/test_read_format_rar5.c b/libarchive/test/test_read_format_rar5.c index 6e0b7a52f..fe2661de1 100644 --- a/libarchive/test/test_read_format_rar5.c +++ b/libarchive/test/test_read_format_rar5.c @@ -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);