]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Merge pull request #2663 from stoeckmann/filename_errpath
authorMartin Matuška <martin@matuska.de>
Thu, 12 Jun 2025 08:56:32 +0000 (10:56 +0200)
committerMartin Matuska <martin@matuska.de>
Wed, 10 Sep 2025 08:14:59 +0000 (10:14 +0200)
open_filename: Free memory on error paths

(cherry picked from commit 47bdf824892f09dc604a6de180202f0f61c225ff)

libarchive/archive_read_open_filename.c
libarchive/archive_write_open_filename.c

index 5f5b3f1f7259f940ff2eee66e1a949c450fa7448..0fb72c9e04ac720739fe7af69c082b36a8c5469e 100644 (file)
@@ -136,8 +136,10 @@ archive_read_open_filenames(struct archive *a, const char **filenames,
                        mine->filename_type = FNT_STDIN;
                } else
                        mine->filename_type = FNT_MBS;
-               if (archive_read_append_callback_data(a, mine) != (ARCHIVE_OK))
+               if (archive_read_append_callback_data(a, mine) != (ARCHIVE_OK)) {
+                       free(mine);
                        return (ARCHIVE_FATAL);
+               }
                if (filenames == NULL)
                        break;
                filename = *(filenames++);
@@ -216,8 +218,10 @@ archive_read_open_filenames_w(struct archive *a, const wchar_t **wfilenames,
                        archive_string_free(&fn);
 #endif
                }
-               if (archive_read_append_callback_data(a, mine) != (ARCHIVE_OK))
+               if (archive_read_append_callback_data(a, mine) != (ARCHIVE_OK)) {
+                       free(mine);
                        return (ARCHIVE_FATAL);
+               }
                if (wfilenames == NULL)
                        break;
                wfilename = *(wfilenames++);
index 34209426558cf7b4207f58be2085086b1fab0355..633f7fe1794d31eca1ff9ca508c2998ac55fae62 100644 (file)
@@ -108,6 +108,7 @@ open_filename(struct archive *a, int mbs_fn, const void *filename)
        else
                r = archive_mstring_copy_wcs(&mine->filename, filename);
        if (r < 0) {
+               free(mine);
                if (errno == ENOMEM) {
                        archive_set_error(a, ENOMEM, "No memory");
                        return (ARCHIVE_FATAL);