p = get_u32(p, &cur_entry->refcnt);
p = get_bytes(p, SHA1_HASH_SIZE, cur_entry->hash);
+ if (is_zero_hash(cur_entry->hash)) {
+ ERROR("The WIM lookup table contains an entry with a "
+ "SHA1 message digest of all 0's");
+ ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
+ FREE(cur_entry);
+ goto out;
+ }
+
duplicate_entry = __lookup_resource(table, cur_entry->hash);
if (duplicate_entry) {
ERROR("The WIM lookup table contains two entries with the "
ERROR("The second entry is:");
print_lookup_table_entry(cur_entry);
ret = WIMLIB_ERR_INVALID_LOOKUP_TABLE_ENTRY;
+ FREE(cur_entry);
goto out;
}
lookup_table_insert(table, cur_entry);
out = __out;
- /* do not write lookup table entries for empty files */
- if (lte->output_resource_entry.original_size == 0)
- return 0;
-
/* Don't write entries that have not had file resources or metadata
* resources written for them. */
if (lte->out_refcnt == 0)
case RESOURCE_IN_STAGING_FILE:
printf("Staging File = `%s'\n", lte->staging_file_name);
break;
+ default:
+ break;
}
putchar('\n');
}
struct dentry *dentry;
struct lookup_table_entry *lte;
unsigned stream_idx;
- const char *stream_name;
+ const char *stream_name = NULL;
char *p = NULL;
if (lookup_flags & LOOKUP_FLAG_ADS_OK) {
return 0;
}
+/* Return the lookup table entry for the unnamed data stream of a dentry, or
+ * NULL if there is none.
+ *
+ * You'd think this would be easier than it actually is, since the unnamed data
+ * stream should be the one referenced from the dentry itself. Alas, if there
+ * are named data streams, Microsoft's "imagex.exe" program will put the unnamed
+ * data stream in one of the alternate data streams instead of inside the
+ * dentry. So we need to check the alternate data streams too.
+ *
+ * Also, note that a dentry may appear to have than one unnamed stream, but if
+ * the SHA1 message digest is all 0's then the corresponding stream does not
+ * really "count" (this is the case for the dentry's own file stream when the
+ * file stream that should be there is actually in one of the alternate stream
+ * entries.). This is despite the fact that we may need to extract such a
+ * missing entry as an empty file or empty named data stream.
+ */
struct lookup_table_entry *
-dentry_first_lte(const struct dentry *dentry, const struct lookup_table *table)
+dentry_unnamed_lte(const struct dentry *dentry,
+ const struct lookup_table *table)
{
if (dentry->resolved)
- return dentry_first_lte_resolved(dentry);
+ return dentry_unnamed_lte_resolved(dentry);
else
- return dentry_first_lte_unresolved(dentry, table);
+ return dentry_unnamed_lte_unresolved(dentry, table);
}