p = metadata_resource;
p = get_u32(p, &sd->total_length);
- p = get_u32(p, &sd->num_entries);
+ p = get_u32(p, (u32*)&sd->num_entries);
+
+ if (sd->num_entries > 0x7fffffff) {
+ ERROR("Security data has too many entries!");
+ ret = WIMLIB_ERR_INVALID_SECURITY_DATA;
+ goto out_free_sd;
+ }
/* Verify the listed total length of the security data is big enough to
* include the sizes array, verify that the file data is big enough to
ERROR("Security data total length (%u) is bigger than the "
"metadata resource length (%"PRIu64")",
sd->total_length, metadata_resource_len);
- ret = WIMLIB_ERR_INVALID_RESOURCE_SIZE;
+ ret = WIMLIB_ERR_INVALID_SECURITY_DATA;
goto out_free_sd;
}
ERROR("Security data total length of %u is too short because "
"there must be at least %"PRIu64" bytes of security data",
sd->total_length, 8 + sizes_size);
- ret = WIMLIB_ERR_INVALID_RESOURCE_SIZE;
+ ret = WIMLIB_ERR_INVALID_SECURITY_DATA;
goto out_free_sd;
}
sd->sizes = MALLOC(sizes_size);
ERROR("Security data total length of %u is too short "
"because there are at least %"PRIu64" bytes of "
"security data", sd->total_length, total_len);
- ret = WIMLIB_ERR_INVALID_RESOURCE_SIZE;
+ ret = WIMLIB_ERR_INVALID_SECURITY_DATA;
goto out_free_sd;
}
sd->descriptors[i] = MALLOC(sd->sizes[i]);
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;
}
-/* XXX We don't actually do anything with the ACL's yet besides being able to
- * print a few things. It seems it would be a lot of work to have comprehensive
- * support for all the weird flags and stuff, and Windows PE seems to be okay
- * running from a WIM file that doesn't have any security data at all... */
-
-static void print_acl(const u8 *p)
+static void print_acl(const u8 *p, const char *type)
{
ACL *acl = (ACL*)p;
TO_LE16(acl->acl_size);
TO_LE16(acl->acl_count);
- printf(" [ACL]\n");
+ printf(" [%s ACL]\n", type);
printf(" Revision = %u\n", acl->revision);
printf(" ACL Size = %u\n", acl->acl_size);
printf(" ACE Count = %u\n", acl->ace_count);
printf(" SID start = %u\n", to_le32(aaa->sid_start));
p += hdr->size;
}
+ putchar('\n');
}
-static void print_sid(const u8 *p)
+static void print_sid(const u8 *p, const char *type)
{
SID *sid = (SID*)p;
- printf(" [SID]\n");
+ printf(" [%s SID]\n", type);
printf(" Revision = %u\n", sid->revision);
printf(" Subauthority count = %u\n", sid->sub_authority_count);
printf(" Identifier authority = ");
putchar('\n');
for (uint i = 0; i < sid->sub_authority_count; i++)
printf(" Subauthority %u = %u\n", i, to_le32(sid->sub_authority[i]));
+ putchar('\n');
}
static void print_security_descriptor(const u8 *p, u64 size)
TO_LE32(sd->sacl_offset);
TO_LE32(sd->dacl_offset);
printf("Revision = %u\n", sd->revision);
- printf("Security Descriptor Control = %u\n", sd->security_descriptor_control);
+ printf("Security Descriptor Control = %#x\n", sd->security_descriptor_control);
printf("Owner offset = %u\n", sd->owner_offset);
printf("Group offset = %u\n", sd->group_offset);
printf("System ACL offset = %u\n", sd->sacl_offset);
printf("Discretionary ACL offset = %u\n", sd->dacl_offset);
if (sd->owner_offset != 0)
- print_sid(p + sd->owner_offset);
+ print_sid(p + sd->owner_offset, "Owner");
if (sd->group_offset != 0)
- print_sid(p + sd->group_offset);
+ print_sid(p + sd->group_offset, "Group");
if (sd->sacl_offset != 0)
- print_acl(p + sd->sacl_offset);
+ print_acl(p + sd->sacl_offset, "System");
if (sd->dacl_offset != 0)
- print_acl(p + sd->dacl_offset);
+ print_acl(p + sd->dacl_offset, "Discretionary");
}
/*