X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fverify.c;h=3085e6a67120661a8a9a1cea07454dea5aecd1f9;hp=89da4b8dff999d0e35b2312ee6297a5ea61186b7;hb=86a767c28bfb9df8921ef9ff61a32c971beb51aa;hpb=4d9794d1f1a6044c261faae0968af1b2c0480f4b diff --git a/src/verify.c b/src/verify.c index 89da4b8d..3085e6a6 100644 --- a/src/verify.c +++ b/src/verify.c @@ -41,25 +41,17 @@ verify_inode(struct wim_inode *inode, const WIMStruct *w) const struct wim_security_data *sd = wim_const_security_data(w); struct wim_dentry *first_dentry = inode_first_dentry(inode); struct wim_dentry *dentry; - int ret = WIMLIB_ERR_INVALID_DENTRY; /* 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); - goto out; - } - - 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); - goto out; + 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, @@ -67,17 +59,17 @@ 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 " "%u of dentry `%"TS"'", i, dentry_full_path(first_dentry)); - goto out; + return WIMLIB_ERR_INVALID_DENTRY; } if (lte) lte->real_refcnt += inode->i_nlink; @@ -88,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); - goto out; + 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 @@ -105,27 +96,26 @@ verify_inode(struct wim_inode *inode, const WIMStruct *w) inode_for_each_dentry(dentry, inode) { if (dentry_has_short_name(dentry)) { if (dentry_with_dos_name) { + /* This was previously an error, but if we + * capture a WIM from UDF on Windows, hard links + * are supported but DOS names are automatically + * generated for all names for an inode. */ + #if 0 ERROR("Hard-linked file has a DOS name at " "both `%"TS"' and `%"TS"'", dentry_full_path(dentry_with_dos_name), dentry_full_path(dentry)); - goto out; + return WIMLIB_ERR_INVALID_DENTRY; + #else + dentry->dos_name_invalid = 1; + #endif } dentry_with_dos_name = dentry; } } - /* 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)); - goto out; - } - inode->i_verified = 1; - ret = 0; -out: - return ret; + return 0; } /* Run some miscellaneous verifications on a WIM dentry */ @@ -140,7 +130,7 @@ verify_dentry(struct wim_dentry *dentry, void *wim) * in which case we need to force the inode to be verified again.) */ if (!dentry->d_inode->i_verified) { ret = verify_inode(dentry->d_inode, w); - if (ret != 0) + if (ret) return ret; }