- const struct wim_lookup_table *table = w->lookup_table;
- const struct wim_security_data *sd = wim_const_security_data(w);
- struct wim_dentry *first_dentry = inode_first_dentry(inode);
- struct wim_dentry *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 ||
- (inode->i_security_id >= 0 &&
- inode->i_security_id >= sd->num_entries))
- {
- 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,
- * except if the SHA1 message digest is all 0's, which indicates an
- * empty stream.
- *
- * This check is skipped on split WIMs. */
- 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(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));
- return WIMLIB_ERR_INVALID_DENTRY;
- }
- if (lte)
- lte->real_refcnt += inode->i_nlink;
- }
- }
-
- /* Make sure there is only one unnamed data stream. */
- unsigned num_unnamed_streams = 0;
- for (unsigned i = 0; i <= inode->i_num_ads; i++) {
- const u8 *hash;
- 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) {
- WARNING("\"%"TS"\" has multiple (%u) un-named streams",
- dentry_full_path(first_dentry), num_unnamed_streams);
- }