int (*decompress)(const void *, uint, void *, uint);
/* Set the appropriate decompress function. */
- if (resource_ctype == WIM_COMPRESSION_TYPE_LZX)
+ if (resource_ctype == WIMLIB_COMPRESSION_TYPE_LZX)
decompress = lzx_decompress;
else
decompress = xpress_decompress;
ctype = wim_resource_compression_type(lte);
- wimlib_assert(ctype != WIM_COMPRESSION_TYPE_NONE ||
+ wimlib_assert(ctype != WIMLIB_COMPRESSION_TYPE_NONE ||
(lte->resource_entry.original_size ==
lte->resource_entry.size));
if ((flags & WIMLIB_RESOURCE_FLAG_RAW)
- || ctype == WIM_COMPRESSION_TYPE_NONE)
+ || ctype == WIMLIB_COMPRESSION_TYPE_NONE)
ret = read_uncompressed_resource(fp,
lte->resource_entry.offset + offset,
size, buf);
case RESOURCE_IN_NTFS_VOLUME:
wimlib_assert(lte->ntfs_loc != NULL);
wimlib_assert(lte->attr != NULL);
- {
- if (lte->ntfs_loc->is_reparse_point)
- offset += 8;
- if (ntfs_attr_pread(lte->attr, offset, size, buf) != size) {
- ERROR_WITH_ERRNO("Error reading NTFS attribute "
- "at `%s'",
- lte->ntfs_loc->path_utf8);
- ret = WIMLIB_ERR_NTFS_3G;
- }
- break;
+ if (lte->ntfs_loc->is_reparse_point)
+ offset += 8;
+ if (ntfs_attr_pread(lte->attr, offset, size, buf) != size) {
+ ERROR_WITH_ERRNO("Error reading NTFS attribute "
+ "at `%s'",
+ lte->ntfs_loc->path_utf8);
+ ret = WIMLIB_ERR_NTFS_3G;
}
+ break;
#endif
default:
wimlib_assert(0);
*
* The output_resource_entry, out_refcnt, and part_number fields of @lte are
* updated.
- *
- * Metadata resources are not copied (they are handled elsewhere for joining and
- * splitting).
*/
int copy_resource(struct lookup_table_entry *lte, void *wim)
{
struct inode_table inode_tab;
const struct lookup_table_entry *metadata_lte;
u64 metadata_len;
- u64 metadata_offset;
struct hlist_head inode_list;
metadata_lte = imd->metadata_lte;
metadata_len = wim_resource_size(metadata_lte);
- metadata_offset = metadata_lte->resource_entry.offset;
DEBUG("Reading metadata resource: length = %"PRIu64", "
- "offset = %"PRIu64"", metadata_len, metadata_offset);
+ "offset = %"PRIu64"", metadata_len,
+ metadata_lte->resource_entry.offset);
/* There is no way the metadata resource could possibly be less than (8
* + WIM_DENTRY_DISK_SIZE) bytes, where the 8 is for security data (with
goto out_free_security_data;
}
+ DEBUG("Reading root dentry");
+
/* Allocate memory for the root dentry and read it into memory */
dentry = MALLOC(sizeof(struct dentry));
if (!dentry) {
/* This is the root dentry, so set its parent to itself. */
dentry->parent = dentry;
- if (ret != 0)
- goto out_free_dentry_tree;
+ if (ret == 0 && dentry->length == 0) {
+ ERROR("Metadata resource cannot begin with end-of-directory entry!");
+ ret = WIMLIB_ERR_INVALID_DENTRY;
+ }
+
+ if (ret != 0) {
+ FREE(dentry);
+ goto out_free_security_data;
+ }
+
inode_add_dentry(dentry, dentry->d_inode);
/* Now read the entire directory entry tree into memory. */
u64 metadata_original_size;
const struct wim_security_data *sd;
- DEBUG("Writing metadata resource for image %d", w->current_image);
+ DEBUG("Writing metadata resource for image %d (offset = %"PRIu64")",
+ w->current_image, ftello(w->out_fp));
root = wim_root_dentry(w);
sd = wim_security_data(w);
- /* We do not allow the security data pointer to be NULL, although it may
- * point to an empty security data with no entries. */
- wimlib_assert(root != NULL);
- wimlib_assert(sd != NULL);
-
/* Offset of first child of the root dentry. It's equal to:
* - The total length of the security data, rounded to the next 8-byte
* boundary,
* - plus 8 bytes for an end-of-directory entry following the root
* dentry (shouldn't really be needed, but just in case...)
*/
- subdir_offset = ((sd->total_length + 7) & ~7) +
+ subdir_offset = (((u64)sd->total_length + 7) & ~7) +
dentry_correct_total_length(root) + 8;
/* Calculate the subdirectory offsets for the entire dentry tree. */
* it. */
lte = wim_metadata_lookup_table_entry(w);
- wimlib_assert(lte != NULL);
-
/* Write the metadata resource to the output WIM using the proper
* compression type. The lookup table entry for the metadata resource
* is updated. */
* */
lookup_table_unlink(w->lookup_table, lte);
lookup_table_insert(w->lookup_table, lte);
-
- wimlib_assert(lte->out_refcnt == 0);
lte->out_refcnt = 1;
- /* Make sure that the resource entry is written marked with the metadata
- * flag. */
+ /* Make sure that the lookup table entry for this metadata resource is
+ * marked with the metadata flag. */
lte->output_resource_entry.flags |= WIM_RESHDR_FLAG_METADATA;
out:
/* All the data has been written to the new WIM; no need for the buffer