X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fverify.c;h=d348e302b2d65edfc4ff29ed66e698d875c660ac;hp=a4be1f8b1ccc7d9105905d483bb3ba3a2546953f;hb=9c7e852e60e96935beef11a28b0f010f7e24e863;hpb=d490e6e2a9cb3e421556ed3e50e0665ec955a418 diff --git a/src/verify.c b/src/verify.c index a4be1f8b..d348e302 100644 --- a/src/verify.c +++ b/src/verify.c @@ -45,20 +45,13 @@ verify_inode(struct wim_inode *inode, const WIMStruct *w) /* Check the security ID. -1 is valid and means "no security * descriptor". Anything else has to be a valid index into the WIM * image's security descriptors table. */ - if (inode->i_security_id < -1) { - ERROR("Dentry `%"TS"' has an invalid security ID (%d)", - dentry_full_path(first_dentry), inode->i_security_id); - return WIMLIB_ERR_INVALID_DENTRY; - } - - if (inode->i_security_id >= 0 && - inode->i_security_id >= sd->num_entries) + if (inode->i_security_id < -1 || + (inode->i_security_id >= 0 && + inode->i_security_id >= sd->num_entries)) { - ERROR("Dentry `%"TS"' has an invalid security ID (%d) " - "(there are only %u entries in the security table)", - dentry_full_path(first_dentry), inode->i_security_id, - sd->num_entries); - return WIMLIB_ERR_INVALID_DENTRY; + WARNING("\"%"TS"\" has an invalid security ID (%d)", + dentry_full_path(first_dentry), inode->i_security_id); + inode->i_security_id = -1; } /* Check that lookup table entries for all the inode's stream exist, @@ -66,11 +59,11 @@ verify_inode(struct wim_inode *inode, const WIMStruct *w) * empty stream. * * This check is skipped on split WIMs. */ - if (w->hdr.total_parts == 1) { + if (w->hdr.total_parts == 1 && !inode->i_resolved) { for (unsigned i = 0; i <= inode->i_num_ads; i++) { struct wim_lookup_table_entry *lte; const u8 *hash; - hash = inode_stream_hash_unresolved(inode, i); + hash = inode_stream_hash(inode, i); lte = __lookup_resource(table, hash); if (!lte && !is_zero_hash(hash)) { ERROR("Could not find lookup table entry for stream " @@ -87,14 +80,13 @@ verify_inode(struct wim_inode *inode, const WIMStruct *w) unsigned num_unnamed_streams = 0; for (unsigned i = 0; i <= inode->i_num_ads; i++) { const u8 *hash; - hash = inode_stream_hash_unresolved(inode, i); + hash = inode_stream_hash(inode, i); if (inode_stream_name_nbytes(inode, i) == 0 && !is_zero_hash(hash)) num_unnamed_streams++; } if (num_unnamed_streams > 1) { - ERROR("Dentry `%"TS"' has multiple (%u) un-named streams", - dentry_full_path(first_dentry), num_unnamed_streams); - return WIMLIB_ERR_INVALID_DENTRY; + WARNING("\"%"TS"\" has multiple (%u) un-named streams", + dentry_full_path(first_dentry), num_unnamed_streams); } /* Files cannot have multiple DOS names, even if they have multiple @@ -122,13 +114,6 @@ verify_inode(struct wim_inode *inode, const WIMStruct *w) } } - /* Directories with multiple links have not been tested. XXX */ - if (inode->i_nlink > 1 && inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY) { - ERROR("Hard-linked directory `%"TS"' is unsupported", - dentry_full_path(first_dentry)); - return WIMLIB_ERR_INVALID_DENTRY; - } - inode->i_verified = 1; return 0; } @@ -158,14 +143,13 @@ verify_dentry(struct wim_dentry *dentry, void *wim) * (This seems to be the case...) */ if (dentry_is_root(dentry)) { if (dentry_has_long_name(dentry) || dentry_has_short_name(dentry)) { - ERROR("The root dentry has a nonempty name!"); - return WIMLIB_ERR_INVALID_DENTRY; - } - } else { - if (!dentry_has_long_name(dentry)) { - ERROR("Dentry `%"TS"' has no long name!", - dentry_full_path(dentry)); - return WIMLIB_ERR_INVALID_DENTRY; + WARNING("The root dentry has a nonempty name"); + FREE(dentry->file_name); + FREE(dentry->short_name); + dentry->file_name = NULL; + dentry->short_name = NULL; + dentry->file_name_nbytes = 0; + dentry->short_name_nbytes = 0; } }