]> wimlib.net Git - wimlib/blobdiff - src/win32_apply.c
win32_apply.c: don't clear directory DACL in NO_ACLS mode
[wimlib] / src / win32_apply.c
index 347407326f914d3c358c0ade3c9928541f640169..ef0823ab0340c7ee7bab0cfa21e1bd3f06cba2f3 100644 (file)
@@ -1661,9 +1661,13 @@ retry:
                 * directory, even though this contradicts Microsoft's
                 * documentation for FILE_ATTRIBUTE_READONLY which states it is
                 * not honored for directories!  */
-               FILE_BASIC_INFORMATION basic_info = { .FileAttributes = FILE_ATTRIBUTE_NORMAL };
-               (*func_NtSetInformationFile)(h, &ctx->iosb, &basic_info,
-                                            sizeof(basic_info), FileBasicInformation);
+               if (!(ctx->common.extract_flags & WIMLIB_EXTRACT_FLAG_NO_ATTRIBUTES)) {
+                       FILE_BASIC_INFORMATION basic_info =
+                               { .FileAttributes = FILE_ATTRIBUTE_NORMAL };
+                       (*func_NtSetInformationFile)(h, &ctx->iosb, &basic_info,
+                                                    sizeof(basic_info),
+                                                    FileBasicInformation);
+               }
 
                /* Also try to remove the directory's DACL.  This isn't supposed
                 * to be necessary because we *always* use backup semantics.
@@ -1671,15 +1675,18 @@ retry:
                 * STATUS_ACCESS_DENIED when creating a named data stream that
                 * was just deleted, using a directory-relative open.  I have no
                 * idea why Windows is broken in this case.  */
-               static const SECURITY_DESCRIPTOR_RELATIVE desc = {
-                       .Revision = SECURITY_DESCRIPTOR_REVISION1,
-                       .Control = SE_SELF_RELATIVE | SE_DACL_PRESENT,
-                       .Owner = 0,
-                       .Group = 0,
-                       .Sacl = 0,
-                       .Dacl = 0,
-               };
-               (*func_NtSetSecurityObject)(h, DACL_SECURITY_INFORMATION, (void *)&desc);
+               if (!(ctx->common.extract_flags & WIMLIB_EXTRACT_FLAG_NO_ACLS)) {
+                       static const SECURITY_DESCRIPTOR_RELATIVE desc = {
+                               .Revision = SECURITY_DESCRIPTOR_REVISION1,
+                               .Control = SE_SELF_RELATIVE | SE_DACL_PRESENT,
+                               .Owner = 0,
+                               .Group = 0,
+                               .Sacl = 0,
+                               .Dacl = 0,
+                       };
+                       (*func_NtSetSecurityObject)(h, DACL_SECURITY_INFORMATION,
+                                                   (void *)&desc);
+               }
        }
 
        if (!dentry_is_root(dentry)) {