From: Martin Matuska Date: Thu, 9 May 2019 21:34:17 +0000 (+0200) Subject: RAR5 reader: use textual representation for entry file attributes X-Git-Tag: v3.4.0~37 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=744a248f55d5dcf369e4d39dba8dd9f05e2af3da;p=thirdparty%2Flibarchive.git RAR5 reader: use textual representation for entry file attributes Add test_read_format_rar5_fileattr --- diff --git a/libarchive/archive_read_support_format_rar5.c b/libarchive/archive_read_support_format_rar5.c index 619f94a0a..9d3f42e6d 100644 --- a/libarchive/archive_read_support_format_rar5.c +++ b/libarchive/archive_read_support_format_rar5.c @@ -1673,7 +1673,6 @@ static int process_head_file(struct archive_read* a, struct rar5* rar, /* Host OS is Windows */ __LA_MODE_T mode; - unsigned long fflags = 0; if(file_attr & ATTR_DIRECTORY) { mode = 0755 | AE_IFDIR; @@ -1687,38 +1686,33 @@ static int process_head_file(struct archive_read* a, struct rar5* rar, archive_entry_set_mode(entry, mode); -#if defined(FILE_ATTRIBUTE_READONLY) || defined(UF_READONLY) - if (file_attr & ATTR_READONLY) { - fflags |= -#if defined(FILE_ATTRIBUTE_READONLY) - FILE_ATTRIBUTE_READONLY; -#else - UF_READONLY; -#endif - } -#endif -#if defined(FILE_ATTRIBUTE_HIDDEN) || defined(UF_HIDDEN) - if (file_attr & ATTR_HIDDEN) { - fflags |= -#if defined(FILE_ATTRIBUTE_HIDDEN) - FILE_ATTRIBUTE_HIDDEN; -#else - UF_HIDDEN; -#endif - } -#endif -#if defined(FILE_ATTRIBUTE_SYSTEM) || defined(UF_SYSTEM) - if (file_attr & ATTR_SYSTEM) { - fflags |= -#if defined(FILE_ATTRIBUTE_SYSTEM) - FILE_ATTRIBUTE_SYSTEM; -#else - UF_SYSTEM; -#endif + if (file_attr & (ATTR_READONLY | ATTR_HIDDEN | ATTR_SYSTEM)) { + char *fflags_text, *p; + /* allocate for "rdonly,hidden,system," */ + fflags_text = malloc(22 * sizeof(char)); + if (fflags_text != NULL) { + p = fflags_text; + if (file_attr & ATTR_READONLY) { + strcpy(p, "rdonly,"); + p = p + 7; + } + if (file_attr & ATTR_HIDDEN) { + p = strcpy(p, "hidden,"); + p = p + 7; + } + if (file_attr & ATTR_SYSTEM) { + p = strcpy(p, "system,"); + p = p + 7; + } + if (p > fflags_text) { + /* Delete trailing comma */ + *(p - 1) = '\0'; + archive_entry_copy_fflags_text(entry, + fflags_text); + } + free(fflags_text); + } } -#endif - if (fflags != 0) - archive_entry_set_fflags(entry, fflags, 0); } else if(host_os == HOST_UNIX) { /* Host OS is Unix */ archive_entry_set_mode(entry, (__LA_MODE_T) file_attr); diff --git a/libarchive/test/test_read_format_rar5.c b/libarchive/test/test_read_format_rar5.c index 29af4ea61..6e0b7a52f 100644 --- a/libarchive/test/test_read_format_rar5.c +++ b/libarchive/test/test_read_format_rar5.c @@ -1086,3 +1086,110 @@ DEFINE_TEST(test_read_format_rar5_nonempty_dir_stream) EPILOGUE(); } + +DEFINE_TEST(test_read_format_rar5_fileattr) +{ + unsigned long set, clear, flag; + + flag = 0; + + PROLOGUE("test_read_format_rar5_fileattr.rar"); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("readonly.txt", archive_entry_pathname(ae)); + assertEqualString("rdonly", archive_entry_fflags_text(ae)); + archive_entry_fflags(ae, &set, &clear); +#if defined(__FreeBSD__) + flag = UF_READONLY; +#elif defined(__WIN32) && !defined(CYGWIN) + flag = FILE_ATTRIBUTE_READONLY; +#endif + assertEqualInt(flag, set & flag); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("hidden.txt", archive_entry_pathname(ae)); + assertEqualString("hidden", archive_entry_fflags_text(ae)); + archive_entry_fflags(ae, &set, &clear); +#if defined(__FreeBSD__) + flag = UF_HIDDEN; +#elif defined(__WIN32) && !defined(CYGWIN) + flag = FILE_ATTRIBUTE_HIDDEN; +#endif + assertEqualInt(flag, set & flag); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("system.txt", archive_entry_pathname(ae)); + assertEqualString("system", archive_entry_fflags_text(ae)); + archive_entry_fflags(ae, &set, &clear); +#if defined(__FreeBSD__) + flag = UF_SYSTEM;; +#elif defined(__WIN32) && !defined(CYGWIN) + flag = FILE_ATTRIBUTE_SYSTEM; +#endif + assertEqualInt(flag, set & flag); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(AE_IFREG, archive_entry_filetype(ae)); + assertEqualString("ro_hidden.txt", archive_entry_pathname(ae)); + assertEqualString("rdonly,hidden", archive_entry_fflags_text(ae)); + archive_entry_fflags(ae, &set, &clear); +#if defined(__FreeBSD__) + flag = UF_READONLY | UF_HIDDEN; +#elif defined(__WIN32) && !defined(CYGWIN) + flag = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN; +#endif + assertEqualInt(flag, set & flag); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualString("dir_readonly", archive_entry_pathname(ae)); + assertEqualString("rdonly", archive_entry_fflags_text(ae)); + archive_entry_fflags(ae, &set, &clear); +#if defined(__FreeBSD__) + flag = UF_READONLY; +#elif defined(__WIN32) && !defined(CYGWIN) + flag = FILE_ATTRIBUTE_READONLY; +#endif + assertEqualInt(flag, set & flag); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualString("dir_hidden", archive_entry_pathname(ae)); + assertEqualString("hidden", archive_entry_fflags_text(ae)); + archive_entry_fflags(ae, &set, &clear); +#if defined(__FreeBSD__) + flag = UF_HIDDEN; +#elif defined(__WIN32) && !defined(CYGWIN) + flag = FILE_ATTRIBUTE_HIDDEN; +#endif + assertEqualInt(flag, set & flag); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualString("dir_system", archive_entry_pathname(ae)); + assertEqualString("system", archive_entry_fflags_text(ae)); + archive_entry_fflags(ae, &set, &clear); +#if defined(__FreeBSD__) + flag = UF_SYSTEM; +#elif defined(__WIN32) && !defined(CYGWIN) + flag = FILE_ATTRIBUTE_SYSTEM; +#endif + assertEqualInt(flag, set & flag); + + assertA(0 == archive_read_next_header(a, &ae)); + assertEqualInt(AE_IFDIR, archive_entry_filetype(ae)); + assertEqualString("dir_rohidden", archive_entry_pathname(ae)); + assertEqualString("rdonly,hidden", archive_entry_fflags_text(ae)); + archive_entry_fflags(ae, &set, &clear); +#if defined(__FreeBSD__) + flag = UF_READONLY | UF_HIDDEN; +#elif defined(__WIN32) && !defined(CYGWIN) + flag = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN; +#endif + assertEqualInt(flag, set & flag); + + EPILOGUE(); +} diff --git a/libarchive/test/test_read_format_rar5_fileattr.rar.uu b/libarchive/test/test_read_format_rar5_fileattr.rar.uu new file mode 100644 index 000000000..456b02504 --- /dev/null +++ b/libarchive/test/test_read_format_rar5_fileattr.rar.uu @@ -0,0 +1,13 @@ +begin 640 test_read_format_rar5_fileattr.rar +M4F%R(1H'`0#SX8+K"P$%!P`&`0&`@(``-$;*1"@"`PN+``2+`"&+W8Z;@``` +M#')E861O;FQY+G1X=`H#`J*C5`BE!M4!,3(S-#4V-S@@#0JYZ,#-)@(#"XL` +M!(L`(F^$/86````*:&ED9&5N+G1X=`H#`G(Q.0^E!M4!,C,T-38W.#D@#0H> +M%_EV)@(#"XL`!(L`)"V,TBB````*$42*0(#"XL`!(L`(RZ?$!V````-0H#`HS,%ABE!M4!Q!O^+"0"`PL`!0`2`````(````ID:7)?:&ED +M9&5N"@,">JRV&:4&U0'&L*8=)`(#"P`%`!0`````@```"F1I7-T96T* +M`P(@+D4;I0;5`2YJ1$0F`@,+``4`$P````"````,9&ER7W)O:&ED9&5N"@," +0CW7S@JT&U0$==U91`P4$```` +` +end