security descriptor application fix
authorEric Biggers <ebiggers3@gmail.com>
Sat, 1 Sep 2012 17:58:09 +0000 (12:58 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Sat, 1 Sep 2012 17:58:09 +0000 (12:58 -0500)
doc/mkwinpeimg.1.in
src/ntfs-apply.c
src/security.c

index dd6084fd987124c0a62a13013baa72bc548c38bd..0db9d6e0f6ac9df6f1c8eb17e7f0526c71dc23d4 100644 (file)
@@ -1,4 +1,4 @@
-.TH MKWINPEIMG "1" "May 2012" "mkwinpeimg (wimlib @VERSION@)" "User Commands"
+.TH MKWINPEIMG "1" "September 2012" "mkwinpeimg (wimlib @VERSION@)" "User Commands"
 .SH NAME
 mkwinpeimg \- Make a customized bootable image of Windows PE
 .SH SYNOPSIS
index 23526810cf50232e468c2c6aae1b167bddf51f2d..d9f6d37a5da9445789bd5d7a1453b472a0d19b9b 100644 (file)
@@ -280,9 +280,9 @@ apply_file_attributes_and_security_data(ntfs_inode *ni,
                                SACL_SECURITY_INFORMATION;
                ret = ntfs_set_inode_security(ni, selection, descriptor);
        #else
-               ntfs_xattr_system_setxattr(&ctx, XATTR_NTFS_ACL,
-                                          ni, dir_ni, descriptor,
-                                          sd->sizes[dentry->security_id], 0);
+               ret = ntfs_xattr_system_setxattr(&ctx, XATTR_NTFS_ACL,
+                                                ni, dir_ni, descriptor,
+                                                sd->sizes[dentry->security_id], 0);
        #endif
                                
                if (ret != 0) {
index 6f0152eae734f8a150bd48a179c4d9939b978b45..fef6043af2fdc0f5910f2c816aaf68b16ffe9c42 100644 (file)
@@ -1,8 +1,9 @@
 /*
  * security.c
  *
- * Read the security data from the WIM.  Doing anything with the security data
- * is not yet implemented other than printing some information about it.
+ * Read and write the WIM security data.  The security data is a table of
+ * security descriptors. Each WIM image has its own security data, but it's
+ * possible that an image's security data have no security descriptors.
  */
 
 /*
 #include "io.h"
 #include "security.h"
 
+/* 
+ * This is a hack to work around a problem in libntfs-3g.  libntfs-3g validates
+ * security descriptors with a function named ntfs_valid_descr().
+ * ntfs_valid_descr() considers a security descriptor that ends in a SACL
+ * (Sysetm Access Control List) with no ACE's (Access Control Entries) to be
+ * invalid.  However, a security descriptor like this exists in the Windows 7
+ * install.wim.  Here, security descriptors matching this pattern are modified
+ * to have no SACL.  This should make no difference since the SACL had no
+ * entries anyway; however  his ensures that that the security descriptors pass
+ * the validation in libntfs-3g.
+ */
+static void empty_sacl_fixup(char *descr, u64 *size_p)
+{
+       if (*size_p >= sizeof(SecurityDescriptor)) {
+               SecurityDescriptor *sd = (SecurityDescriptor*)descr;
+               u32 sacl_offset = le32_to_cpu(sd->sacl_offset);
+               if (sacl_offset == *size_p - sizeof(ACL)) {
+                       sd->sacl_offset = to_le32(0);
+                       *size_p -= sizeof(ACL);
+               }
+       }
+}
+
 /* 
  * Reads the security data from the metadata resource.
  *
@@ -150,6 +174,7 @@ int read_security_data(const u8 metadata_resource[], u64 metadata_resource_len,
                        goto out_free_sd;
                }
                p = get_bytes(p, sd->sizes[i], sd->descriptors[i]);
+               empty_sacl_fixup(sd->descriptors[i], &sd->sizes[i]);
        }
 out:
        sd->total_length = (u32)total_len;