From: Martin Matuška Date: Tue, 9 Jun 2026 06:25:10 +0000 (+0200) Subject: Merge pull request #3113 from stoeckmann/fflags_strcpy X-Git-Tag: v3.8.8~43 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e150c2f41;p=thirdparty%2Flibarchive.git Merge pull request #3113 from stoeckmann/fflags_strcpy 7zip/rar5: Simplify file attribute handling (cherry picked from commit 5ce51120876625acbc61b95b0336c62b34daf294) --- diff --git a/libarchive/archive_read_support_format_7zip.c b/libarchive/archive_read_support_format_7zip.c index 785c1fb00..7d5b8f999 100644 --- a/libarchive/archive_read_support_format_7zip.c +++ b/libarchive/archive_read_support_format_7zip.c @@ -1016,29 +1016,19 @@ archive_read_format_7zip_read_header(struct archive_read *a, const int supported_attrs = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM; if (zip_entry->attr & supported_attrs) { - char *fflags_text, *ptr; - /* allocate for ",rdonly,hidden,system" */ - fflags_text = malloc(22 * sizeof(*fflags_text)); - if (fflags_text != NULL) { - ptr = fflags_text; - if (zip_entry->attr & FILE_ATTRIBUTE_READONLY) { - strcpy(ptr, ",rdonly"); - ptr = ptr + 7; - } - if (zip_entry->attr & FILE_ATTRIBUTE_HIDDEN) { - strcpy(ptr, ",hidden"); - ptr = ptr + 7; - } - if (zip_entry->attr & FILE_ATTRIBUTE_SYSTEM) { - strcpy(ptr, ",system"); - ptr = ptr + 7; - } - if (ptr > fflags_text) { - archive_entry_copy_fflags_text(entry, - fflags_text + 1); - } - free(fflags_text); - } + char buf[sizeof(",rdonly,hidden,system")]; + char *fflags[3] = { "", "", "" }; + char **flag = fflags; + + if (zip_entry->attr & FILE_ATTRIBUTE_READONLY) + *flag++ = ",rdonly"; + if (zip_entry->attr & FILE_ATTRIBUTE_HIDDEN) + *flag++ = ",hidden"; + if (zip_entry->attr & FILE_ATTRIBUTE_SYSTEM) + *flag++ = ",system"; + + snprintf(buf, sizeof(buf), "%s%s%s", fflags[0], fflags[1], fflags[2]); + archive_entry_copy_fflags_text(entry, buf + 1); } /* If there's no body, force read_data() to return EOF immediately. */ diff --git a/libarchive/archive_read_support_format_rar5.c b/libarchive/archive_read_support_format_rar5.c index 86f52315f..5e502b109 100644 --- a/libarchive/archive_read_support_format_rar5.c +++ b/libarchive/archive_read_support_format_rar5.c @@ -1948,29 +1948,20 @@ 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, *ptr; - /* allocate for ",rdonly,hidden,system" */ - fflags_text = malloc(22 * sizeof(*fflags_text)); - if (fflags_text != NULL) { - ptr = fflags_text; - if (file_attr & ATTR_READONLY) { - strcpy(ptr, ",rdonly"); - ptr = ptr + 7; - } - if (file_attr & ATTR_HIDDEN) { - strcpy(ptr, ",hidden"); - ptr = ptr + 7; - } - if (file_attr & ATTR_SYSTEM) { - strcpy(ptr, ",system"); - ptr = ptr + 7; - } - if (ptr > fflags_text) { - archive_entry_copy_fflags_text(entry, - fflags_text + 1); - } - free(fflags_text); - } + char buf[sizeof(",rdonly,hidden,system")]; + char *fflags[3] = { "", "", "" }; + char **flag = fflags; + + if (file_attr & ATTR_READONLY) + *flag++ = ",rdonly"; + if (file_attr & ATTR_HIDDEN) + *flag++ = ",hidden"; + if (file_attr & ATTR_SYSTEM) + *flag++ = ",system"; + + snprintf(buf, sizeof(buf), "%s%s%s", + fflags[0], fflags[1], fflags[2]); + archive_entry_copy_fflags_text(entry, buf + 1); } } else if(host_os == HOST_UNIX) { /* Host OS is Unix */