- 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);
- }
-
- /* Files cannot have multiple DOS names, even if they have multiple
- * names in multiple directories (i.e. hard links).
- * Source: NTFS-3g authors. */
- struct wim_dentry *dentry_with_dos_name = NULL;
- 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));
- 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));
- return WIMLIB_ERR_INVALID_DENTRY;