* "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++) {
inode_for_each_dentry(other_dentry, dentry->d_inode) {
if (dentry_has_short_name(other_dentry)
&& !other_dentry->skeleton_extracted
- && other_dentry->in_extraction_tree)
+ && other_dentry->in_extraction_tree
+ && !other_dentry->extraction_skipped)
{
DEBUG("Creating %"TS" before %"TS" "
"to guarantee correct DOS name extraction",
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;
/* Extract stream to temporary file. */
ret = create_temporary_file(&tmpfile_fd, &tmpfile_name);
- if (ret)
+ if (ret) {
+ lte_unbind_wim_resource_spec(needed_lte);
goto out_free_found_lte;
+ }
ret = extract_full_stream_to_fd(needed_lte,
&tmpfile_fd);
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;
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)
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;
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",