From 23ac061e696528b8106d7e69cbc9f9e92e962c42 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 22 Nov 2021 17:55:42 -0800 Subject: [PATCH] export_image.c: allow duplicate image names in source WIM 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 | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/src/export_image.c b/src/export_image.c index b8d19dc2..561b1464 100644 --- a/src/export_image.c +++ b/src/export_image.c @@ -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) -- 2.43.0