X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fmount_image.c;h=af39246128e2fdffa04fe256c49bb6f507abbd03;hb=cdf7299e77148206b8a4cb665ddd7a00a0e8ed91;hp=d2ce94b215e36e1ab774a34cf90b12d07d71eb64;hpb=a911e31d082f3f6a2ca6e8e56df9bf5c2638cbb7;p=wimlib diff --git a/src/mount_image.c b/src/mount_image.c index d2ce94b2..af392461 100644 --- a/src/mount_image.c +++ b/src/mount_image.c @@ -758,7 +758,7 @@ static int update_lte_of_staging_file(struct wim_lookup_table_entry *lte, inode_update_lte_ptr(lte->lte_inode, lte, NULL); free_lookup_table_entry(lte); } else { - wimlib_assert(<e->file_on_disk == <e->staging_file_name); + BUILD_BUG_ON(<e->file_on_disk != <e->staging_file_name); lte->resource_entry.original_size = stbuf.st_size; lte->resource_entry.size = stbuf.st_size; lte->resource_location = RESOURCE_IN_FILE_ON_DISK; @@ -802,7 +802,7 @@ static int rebuild_wim(struct wimfs_context *ctx, int write_flags, } DEBUG("Calculating SHA1 checksums for all new staging files."); - list_for_each_entry(lte, &ctx->staging_list, staging_list) { + list_for_each_entry_safe(lte, tmp, &ctx->staging_list, staging_list) { ret = update_lte_of_staging_file(lte, w->lookup_table); if (ret != 0) return ret; @@ -848,12 +848,9 @@ static int set_message_queue_names(struct wimfs_context *ctx, return WIMLIB_ERR_NOTDIR; } - p = dir_path; - while (*p) { + for (p = dir_path; *p; p++) if (*p == '/') *p = 0xff; - p++; - } ctx->unmount_to_daemon_mq_name = strcat_dup(u2d_prefix, dir_path, NAME_MAX); @@ -2328,7 +2325,7 @@ WIMLIBAPI int wimlib_mount_image(WIMStruct *wim, int image, const char *dir, unsigned num_additional_swms, const char *staging_dir) { - int argc = 0; + int argc; char *argv[16]; int ret; char *dir_copy; @@ -2428,6 +2425,7 @@ WIMLIBAPI int wimlib_mount_image(WIMStruct *wim, int image, const char *dir, if (!dir_copy) goto out_free_message_queue_names; + argc = 0; argv[argc++] = "imagex"; argv[argc++] = dir_copy; @@ -2499,6 +2497,12 @@ WIMLIBAPI int wimlib_mount_image(WIMStruct *wim, int image, const char *dir, if (ret) ret = WIMLIB_ERR_FUSE; + + /* Try to delete the staging directory if a deletion wasn't yet + * attempted due to an earlier error */ + if (ctx.staging_dir_name) + delete_staging_dir(&ctx); + out_free_dir_copy: FREE(dir_copy); out_unlock: