X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Flookup_table.c;h=393c0d68afaf74d90fe69bc9990a763f8c22b045;hp=ab13e5e11c91d50a42706c49bad21f0d1755674b;hb=9fb3aaca115429b0af2a623bf20bfceef74f047f;hpb=8c26ca707e56d9848e52076ad3f7c26ea7fa338d diff --git a/src/lookup_table.c b/src/lookup_table.c index ab13e5e1..393c0d68 100644 --- a/src/lookup_table.c +++ b/src/lookup_table.c @@ -84,11 +84,20 @@ clone_lookup_table_entry(const struct wim_lookup_table_entry *old) memcpy(new, old, sizeof(*old)); new->extracted_file = NULL; switch (new->resource_location) { - case RESOURCE_IN_STAGING_FILE: - case RESOURCE_IN_FILE_ON_DISK: #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); @@ -110,18 +119,18 @@ clone_lookup_table_entry(const struct wim_lookup_table_entry *old) if (!loc) goto out_free; memcpy(loc, old->ntfs_loc, sizeof(*loc)); - loc->path_utf8 = NULL; - loc->stream_name_utf16 = NULL; + loc->path = NULL; + loc->stream_name = NULL; new->ntfs_loc = loc; - loc->path_utf8 = STRDUP(old->ntfs_loc->path_utf8); - if (!loc->path_utf8) + loc->path = STRDUP(old->ntfs_loc->path); + if (!loc->path) goto out_free; - loc->stream_name_utf16 = MALLOC(loc->stream_name_utf16_num_chars * 2); - if (!loc->stream_name_utf16) + loc->stream_name = MALLOC((loc->stream_name_nchars + 1) * 2); + if (!loc->stream_name) goto out_free; - memcpy(loc->stream_name_utf16, - old->ntfs_loc->stream_name_utf16, - loc->stream_name_utf16_num_chars * 2); + memcpy(loc->stream_name, + old->ntfs_loc->stream_name, + (loc->stream_name_nchars + 1) * 2); } break; #endif @@ -153,8 +162,8 @@ void free_lookup_table_entry(struct wim_lookup_table_entry *lte) #ifdef WITH_NTFS_3G case RESOURCE_IN_NTFS_VOLUME: if (lte->ntfs_loc) { - FREE(lte->ntfs_loc->path_utf8); - FREE(lte->ntfs_loc->stream_name_utf16); + FREE(lte->ntfs_loc->path); + FREE(lte->ntfs_loc->stream_name); FREE(lte->ntfs_loc); } break; @@ -572,23 +581,25 @@ __lookup_resource(const struct wim_lookup_table *table, const u8 hash[]) * * This is only for pre-resolved inodes. */ -int lookup_resource(WIMStruct *w, const char *path, - int lookup_flags, - struct wim_dentry **dentry_ret, - struct wim_lookup_table_entry **lte_ret, - u16 *stream_idx_ret) +int +lookup_resource(WIMStruct *w, + const mbchar *path, + int lookup_flags, + struct wim_dentry **dentry_ret, + struct wim_lookup_table_entry **lte_ret, + u16 *stream_idx_ret) { struct wim_dentry *dentry; struct wim_lookup_table_entry *lte; u16 stream_idx; - const char *stream_name = NULL; + const mbchar *stream_name = NULL; struct wim_inode *inode; - char *p = NULL; + mbchar *p = NULL; if (lookup_flags & LOOKUP_FLAG_ADS_OK) { stream_name = path_stream_name(path); if (stream_name) { - p = (char*)stream_name - 1; + p = (mbchar*)stream_name - 1; *p = '\0'; } } @@ -597,7 +608,7 @@ int lookup_resource(WIMStruct *w, const char *path, if (p) *p = ':'; if (!dentry) - return -ENOENT; + return -errno; inode = dentry->d_inode;