]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Merge pull request #3113 from stoeckmann/fflags_strcpy
authorMartin Matuška <martin@matuska.de>
Tue, 9 Jun 2026 06:25:10 +0000 (08:25 +0200)
committerMartin Matuska <martin@matuska.de>
Tue, 23 Jun 2026 09:00:43 +0000 (11:00 +0200)
7zip/rar5: Simplify file attribute handling

(cherry picked from commit 5ce51120876625acbc61b95b0336c62b34daf294)

libarchive/archive_read_support_format_7zip.c
libarchive/archive_read_support_format_rar5.c

index 785c1fb00a9c31687688ee16c74131f73bf9e218..7d5b8f999a466d7ea16e3a9e5fc36affedd61758 100644 (file)
@@ -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. */
index 86f52315f7235dd35239f34048bf410b77f6c1cc..5e502b1090919c2883b4bd03ced1445478bca2a6 100644 (file)
@@ -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 */