header.c, lookup_table.c: Read/write data from structures
[wimlib] / src / metadata_resource.c
index 5b22ab6dd378a2503e4b728b7d4c87fc527eccb5..13ebf51ff6611dc2ddcc854153d3487abae944de 100644 (file)
@@ -59,7 +59,6 @@ read_metadata_resource(WIMStruct *wim, struct wim_image_metadata *imd)
        struct wim_dentry *root;
        const struct wim_lookup_table_entry *metadata_lte;
        u64 metadata_len;
-       struct wim_security_data *security_data;
 
        metadata_lte = imd->metadata_lte;
        metadata_len = wim_resource_size(metadata_lte);
@@ -114,7 +113,7 @@ read_metadata_resource(WIMStruct *wim, struct wim_image_metadata *imd)
         * and calculate the offset in the metadata resource of the root dentry.
         * */
 
-       ret = read_wim_security_data(buf, metadata_len, &security_data);
+       ret = read_wim_security_data(buf, metadata_len, &imd->security_data);
        if (ret)
                goto out_free_buf;
 
@@ -128,7 +127,7 @@ read_metadata_resource(WIMStruct *wim, struct wim_image_metadata *imd)
        }
 
        ret = read_dentry(buf, metadata_len,
-                         security_data->total_length, root);
+                         imd->security_data->total_length, root);
 
        if (ret == 0 && root->length == 0) {
                ERROR("Metadata resource cannot begin with end-of-directory entry!");
@@ -157,6 +156,8 @@ read_metadata_resource(WIMStruct *wim, struct wim_image_metadata *imd)
                goto out_free_dentry_tree;
 
        if (!wim->all_images_verified) {
+               /* Note: verify_dentry() expects to access imd->security_data,
+                * so it needs to be set before here. */
                DEBUG("Running miscellaneous verifications on the dentry tree");
                for_lookup_table_entry(wim->lookup_table, lte_zero_real_refcnt, NULL);
                ret = for_dentry_in_tree(root, verify_dentry, wim);
@@ -167,13 +168,13 @@ read_metadata_resource(WIMStruct *wim, struct wim_image_metadata *imd)
        DEBUG("Done reading image metadata");
 
        imd->root_dentry = root;
-       imd->security_data = security_data;
        INIT_LIST_HEAD(&imd->unhashed_streams);
        goto out_free_buf;
 out_free_dentry_tree:
        free_dentry_tree(root, wim->lookup_table);
 out_free_security_data:
-       free_wim_security_data(security_data);
+       free_wim_security_data(imd->security_data);
+       imd->security_data = NULL;
 out_free_buf:
        FREE(buf);
        return ret;