X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fextract.c;h=3e4fbcc88fca43e94d489aea8de3b11591548d3c;hb=4f5e1d7a26589f3b5db5ca6e88d4f96c3a19d143;hp=2e285f540aea90b815c52d5e95db786af027e1e0;hpb=92502e53658f09310d67118a0bbc18fa83a1b6f0;p=wimlib diff --git a/src/extract.c b/src/extract.c index 2e285f54..3e4fbcc8 100644 --- a/src/extract.c +++ b/src/extract.c @@ -93,7 +93,7 @@ dentry_resolve_and_zero_lte_refcnt(struct wim_dentry *dentry, void *_ctx) * "resolve" the inode's streams anyway by allocating new entries. */ if (ctx->extract_flags & WIMLIB_EXTRACT_FLAG_FROM_PIPE) force = true; - ret = inode_resolve_ltes(inode, ctx->wim->lookup_table, force); + ret = inode_resolve_streams(inode, ctx->wim->lookup_table, force); if (ret) return ret; for (unsigned i = 0; i <= inode->i_num_ads; i++) { @@ -1508,7 +1508,7 @@ extract_streams_from_pipe(struct apply_ctx *ctx) if ((found_lte->resource_location != RESOURCE_NONEXISTENT) && !(found_lte->flags & WIM_RESHDR_FLAG_METADATA) - && (needed_lte = lookup_resource(lookup_table, found_lte->hash)) + && (needed_lte = lookup_stream(lookup_table, found_lte->hash)) && (needed_lte->out_refcnt)) { tchar *tmpfile_name = NULL; @@ -1707,17 +1707,6 @@ file_name_valid(utf16lechar *name, size_t num_chars, bool fix) return true; } -static bool -dentry_is_dot_or_dotdot(const struct wim_dentry *dentry) -{ - const utf16lechar *file_name = dentry->file_name; - return file_name != NULL && - file_name[0] == cpu_to_le16('.') && - (file_name[1] == cpu_to_le16('\0') || - (file_name[1] == cpu_to_le16('.') && - file_name[2] == cpu_to_le16('\0'))); -} - static int dentry_mark_skipped(struct wim_dentry *dentry, void *_ignore) { @@ -1755,14 +1744,6 @@ dentry_calculate_extraction_path(struct wim_dentry *dentry, void *_args) if (!dentry_is_supported(dentry, &ctx->supported_features)) goto skip_dentry; - if (dentry_is_dot_or_dotdot(dentry)) { - /* WIM files shouldn't contain . or .. entries. But if they are - * there, don't attempt to extract them. */ - WARNING("Skipping extraction of unexpected . or .. file " - "\"%"TS"\"", dentry_full_path(dentry)); - goto skip_dentry; - } - if (!ctx->ops->supports_case_sensitive_filenames) { struct wim_dentry *other; @@ -3178,11 +3159,6 @@ wimlib_extract_paths(WIMStruct *wim, wimlib_progress_func_t progress_func) { int ret; - struct append_dentry_ctx append_dentry_ctx = { - .dentries = NULL, - .num_dentries = 0, - .num_alloc_dentries = 0, - }; struct wim_dentry **trees; size_t num_trees; @@ -3202,6 +3178,13 @@ wimlib_extract_paths(WIMStruct *wim, return ret; if (extract_flags & WIMLIB_EXTRACT_FLAG_GLOB_PATHS) { + + struct append_dentry_ctx append_dentry_ctx = { + .dentries = NULL, + .num_dentries = 0, + .num_alloc_dentries = 0, + }; + u32 wildcard_flags = 0; if (extract_flags & WIMLIB_EXTRACT_FLAG_STRICT_GLOB) @@ -3213,10 +3196,17 @@ wimlib_extract_paths(WIMStruct *wim, wildcard_flags |= WILDCARD_FLAG_CASE_INSENSITIVE; for (size_t i = 0; i < num_paths; i++) { - ret = expand_wildcard(wim, paths[i], + tchar *path = canonicalize_wim_path(paths[i]); + if (path == NULL) { + ret = WIMLIB_ERR_NOMEM; + trees = append_dentry_ctx.dentries; + goto out_free_trees; + } + ret = expand_wildcard(wim, path, append_dentry_cb, &append_dentry_ctx, wildcard_flags); + FREE(path); if (ret) { trees = append_dentry_ctx.dentries; goto out_free_trees; @@ -3230,8 +3220,16 @@ wimlib_extract_paths(WIMStruct *wim, return WIMLIB_ERR_NOMEM; for (size_t i = 0; i < num_paths; i++) { - trees[i] = get_dentry(wim, paths[i], + + tchar *path = canonicalize_wim_path(paths[i]); + if (path == NULL) { + ret = WIMLIB_ERR_NOMEM; + goto out_free_trees; + } + + trees[i] = get_dentry(wim, path, WIMLIB_CASE_PLATFORM_DEFAULT); + FREE(path); if (trees[i] == NULL) { ERROR("Path \"%"TS"\" does not exist " "in WIM image %d",