]> wimlib.net Git - wimlib/commitdiff
export_image.c: allow duplicate image names in source WIM
authorEric Biggers <ebiggers3@gmail.com>
Tue, 23 Nov 2021 01:55:42 +0000 (17:55 -0800)
committerEric Biggers <ebiggers3@gmail.com>
Tue, 23 Nov 2021 02:11:01 +0000 (18:11 -0800)
Reported at https://wimlib.net/forums/viewtopic.php?f=1&t=568.  DISM can
create WIM files containing images with duplicate names, whereas wimlib
enforces unique image names in certain cases such as adding images,
exporting images, and changing image names.  This behavior generally
seems fine, but the "export" check is too strict: an export of "all"
images will fail if the source WIM contains duplicate names.

Fix this by making wimlib_export_image() allow duplicate image names in
the source WIM, provided that they don't collide with image names that
already exist in the destination WIM.

src/export_image.c

index b8d19dc224f37f234f5a220b695c709af0df2cee..561b14644f5101e0af5e4f1c99e109fc4a7da262 100644 (file)
@@ -179,6 +179,26 @@ wimlib_export_image(WIMStruct *src_wim,
        /* Enable rollbacks  */
        for_blob_in_table(dest_wim->blob_table, blob_set_not_exported, NULL);
 
+       /* Forbid exports where the destination WIM already contains image(s)
+        * with the requested name(s).  However, allow multi-image exports where
+        * there is a duplication among the source names only.  */
+       if (!(export_flags & WIMLIB_EXPORT_FLAG_NO_NAMES)) {
+               for (src_image = start_src_image;
+                    src_image <= end_src_image;
+                    src_image++)
+               {
+                       const tchar *name = dest_name ? dest_name :
+                               wimlib_get_image_name(src_wim, src_image);
+
+                       if (wimlib_image_name_in_use(dest_wim, name)) {
+                               ERROR("There is already an image named \"%"TS"\" "
+                                     "in the destination WIM", name);
+                               ret = WIMLIB_ERR_IMAGE_NAME_COLLISION;
+                               goto out_rollback;
+                       }
+               }
+       }
+
        /* Export each requested image.  */
        for (src_image = start_src_image;
             src_image <= end_src_image;
@@ -204,14 +224,6 @@ wimlib_export_image(WIMStruct *src_wim,
                else
                        next_dest_description = wimlib_get_image_description(src_wim, src_image);
 
-               /* Check for name conflict.  */
-               if (wimlib_image_name_in_use(dest_wim, next_dest_name)) {
-                       ERROR("There is already an image named \"%"TS"\" "
-                             "in the destination WIM", next_dest_name);
-                       ret = WIMLIB_ERR_IMAGE_NAME_COLLISION;
-                       goto out_rollback;
-               }
-
                /* Load metadata for source image into memory.  */
                ret = select_wim_image(src_wim, src_image);
                if (ret)