return (length + 7) & ~7;
}
+u64 dentry_correct_total_length(const struct dentry *dentry)
+{
+ return __dentry_total_length(dentry,
+ dentry_correct_length_unaligned(dentry));
+}
+
/* Real length of a dentry, including the alternate data stream entries, which
* are not included in the dentry->length field... */
u64 dentry_total_length(const struct dentry *dentry)
/* Advance the subdir offset by the amount of space the children
* of this dentry take up. */
do {
- *subdir_offset_p += __dentry_total_length(child,
- dentry_correct_length(child));
+ *subdir_offset_p += dentry_correct_total_length(child);
child = child->next;
} while (child != dentry->children);
extern const char *path_stream_name(const char *path);
extern u64 dentry_total_length(const struct dentry *dentry);
+extern u64 dentry_correct_total_length(const struct dentry *dentry);
extern void stbuf_to_dentry(const struct stat *stbuf, struct dentry *dentry);
* - 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) + dentry_total_length(root) + 8;
+ subdir_offset = ((sd->total_length + 7) & ~7) +
+ dentry_correct_total_length(root) + 8;
/* Calculate the subdirectory offsets for the entire dentry tree. */
calculate_subdir_offsets(root, &subdir_offset);
DEBUG("Writing security data (total_length = %"PRIu32", num_entries "
"= %"PRIu32")", sd->total_length, sd->num_entries);
+ u32 aligned_length = (sd->total_length + 7) & ~7;
+
u8 *orig_p = p;
- p = put_u32(p, sd->total_length);
+ p = put_u32(p, aligned_length);
p = put_u32(p, sd->num_entries);
for (u32 i = 0; i < sd->num_entries; i++)
p = put_bytes(p, sd->sizes[i], sd->descriptors[i]);
wimlib_assert(p - orig_p == sd->total_length);
+ p = put_zeroes(p, aligned_length - sd->total_length);
DEBUG("Successfully wrote security data.");
return p;