]> wimlib.net Git - wimlib/blobdiff - src/extract.c
Refactor some of the dentry, inode, and lookup table code
[wimlib] / src / extract.c
index 40838c4a74b1c4947800fd06f7ea0d0fd8564613..9a43e630b7c0e3d2b840be0bc83769aafcaae29e 100644 (file)
@@ -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++) {
@@ -1147,7 +1147,8 @@ dentry_extract_skeleton(struct wim_dentry *dentry, void *_ctx)
                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",
@@ -1507,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;
@@ -1527,8 +1528,10 @@ extract_streams_from_pipe(struct apply_ctx *ctx)
 
                                /* 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);
@@ -3175,11 +3178,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;
 
@@ -3199,6 +3197,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)
@@ -3210,10 +3215,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;
@@ -3227,8 +3239,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",