+ struct wim_lookup_table_entry *new;
+
+ new = MALLOC(sizeof(*new));
+ if (!new)
+ return NULL;
+
+ memcpy(new, old, sizeof(*old));
+ new->extracted_file = NULL;
+ switch (new->resource_location) {
+#ifdef __WIN32__
+ case RESOURCE_WIN32:
+ {
+ size_t nbytes = utf16le_strlen(old->win32_file_on_disk);
+ new->win32_file_on_disk = MALLOC(nbytes + 2);
+ if (!new->win32_file_on_disk)
+ goto out_free;
+ memcpy(new->win32_file_on_disk, old->win32_file_on_disk,
+ nbytes + 2);
+ }
+ break;
+#endif
+ case RESOURCE_IN_STAGING_FILE:
+ case RESOURCE_IN_FILE_ON_DISK:
+ BUILD_BUG_ON((void*)&old->file_on_disk !=
+ (void*)&old->staging_file_name);
+ new->staging_file_name = STRDUP(old->staging_file_name);
+ if (!new->staging_file_name)
+ goto out_free;
+ break;
+ case RESOURCE_IN_ATTACHED_BUFFER:
+ new->attached_buffer = MALLOC(wim_resource_size(old));
+ if (!new->attached_buffer)
+ goto out_free;
+ memcpy(new->attached_buffer, old->attached_buffer,
+ wim_resource_size(old));
+ break;
+#ifdef WITH_NTFS_3G
+ case RESOURCE_IN_NTFS_VOLUME:
+ if (old->ntfs_loc) {
+ struct ntfs_location *loc;
+ loc = MALLOC(sizeof(*loc));
+ if (!loc)
+ goto out_free;
+ memcpy(loc, old->ntfs_loc, sizeof(*loc));
+ loc->path = NULL;
+ loc->stream_name = NULL;
+ new->ntfs_loc = loc;
+ loc->path = STRDUP(old->ntfs_loc->path);
+ if (!loc->path)
+ goto out_free;
+ loc->stream_name = MALLOC((loc->stream_name_nchars + 1) * 2);
+ if (!loc->stream_name)
+ goto out_free;
+ memcpy(loc->stream_name,
+ old->ntfs_loc->stream_name,
+ (loc->stream_name_nchars + 1) * 2);
+ }
+ break;