]> wimlib.net Git - wimlib/blobdiff - src/metadata_resource.c
Remove verify_dentry(); separate refcnt recalc. from verify_inode()
[wimlib] / src / metadata_resource.c
index 041d1f78007bb843631e84f578268fa5f8f88a87..5f392e52dbc15123f65c58c9ae3b657938b4b9bd 100644 (file)
@@ -60,6 +60,8 @@ read_metadata_resource(WIMStruct *wim, struct wim_image_metadata *imd)
        const struct wim_lookup_table_entry *metadata_lte;
        u64 metadata_len;
        u8 hash[SHA1_HASH_SIZE];
+       struct wim_security_data *security_data;
+       struct wim_inode *inode;
 
        metadata_lte = imd->metadata_lte;
        metadata_len = wim_resource_size(metadata_lte);
@@ -121,7 +123,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, &imd->security_data);
+       ret = read_wim_security_data(buf, metadata_len, &security_data);
        if (ret)
                goto out_free_buf;
 
@@ -135,11 +137,14 @@ read_metadata_resource(WIMStruct *wim, struct wim_image_metadata *imd)
        }
 
        ret = read_dentry(buf, metadata_len,
-                         imd->security_data->total_length, root);
+                         security_data->total_length, root);
 
        if (ret == 0 && root->length == 0) {
-               ERROR("Metadata resource cannot begin with end-of-directory entry!");
-               ret = WIMLIB_ERR_INVALID_DENTRY;
+               WARNING("Metadata resource begins with end-of-directory entry "
+                       "(treating as empty image)");
+               FREE(root);
+               root = NULL;
+               goto out_success;
        }
 
        if (ret) {
@@ -147,6 +152,16 @@ read_metadata_resource(WIMStruct *wim, struct wim_image_metadata *imd)
                goto out_free_security_data;
        }
 
+       if (dentry_has_long_name(root) || dentry_has_short_name(root)) {
+               WARNING("The root directory has a nonempty name (removing it)");
+               FREE(root->file_name);
+               FREE(root->short_name);
+               root->file_name = NULL;
+               root->short_name = NULL;
+               root->file_name_nbytes = 0;
+               root->short_name_nbytes = 0;
+       }
+
        /* This is the root dentry, so set its parent to itself. */
        root->parent = root;
 
@@ -163,26 +178,24 @@ read_metadata_resource(WIMStruct *wim, struct wim_image_metadata *imd)
        if (ret)
                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);
+
+       DEBUG("Running miscellaneous verifications on the dentry tree");
+       image_for_each_inode(inode, imd) {
+               ret = verify_inode(inode, security_data);
                if (ret)
                        goto out_free_dentry_tree;
        }
-
        DEBUG("Done reading image metadata");
-
+out_success:
        imd->root_dentry = root;
+       imd->security_data = security_data;
        INIT_LIST_HEAD(&imd->unhashed_streams);
+       ret = 0;
        goto out_free_buf;
 out_free_dentry_tree:
        free_dentry_tree(root, wim->lookup_table);
 out_free_security_data:
-       free_wim_security_data(imd->security_data);
-       imd->security_data = NULL;
+       free_wim_security_data(security_data);
 out_free_buf:
        FREE(buf);
        return ret;