]> wimlib.net Git - wimlib/blobdiff - src/ntfs-3g_apply.c
wimlib-imagex: improve error message
[wimlib] / src / ntfs-3g_apply.c
index ba90fae8f51e257c20c20718d85ccce6a1fe46a4..07dbdf65094df0e05c865b202b455b5b2f3e18d0 100644 (file)
@@ -30,6 +30,7 @@
 #  include "config.h"
 #endif
 
+#include <errno.h>
 #include <locale.h>
 #include <string.h>
 
@@ -123,10 +124,7 @@ sid_size(const wimlib_SID *sid)
 static void *
 sd_fixup(const void *_desc, size_t *size_p)
 {
-       u32 owner_offset, group_offset, dacl_offset;
-#if !defined(HAVE_NTFS_MNT_RDONLY)
-       u32 sacl_offset;
-#endif
+       u32 owner_offset, group_offset, dacl_offset, sacl_offset;
        bool owner_valid, group_valid;
        size_t size = *size_p;
        const wimlib_SECURITY_DESCRIPTOR_RELATIVE *desc = _desc;
@@ -142,23 +140,15 @@ sd_fixup(const void *_desc, size_t *size_p)
        else
                dacl_offset = 0;
 
-#if !defined(HAVE_NTFS_MNT_RDONLY)
        if (le16_to_cpu(desc->control) & wimlib_SE_SACL_PRESENT)
                sacl_offset = le32_to_cpu(desc->sacl_offset);
        else
                sacl_offset = 0;
-#endif
 
        /* Check if the security descriptor will be affected by one of the bugs.
-        * If not, do nothing and return.
-        *
-        * Note: HAVE_NTFS_MNT_RDONLY is defined if libntfs-3g is
-        * version 2013.1.13 or later.  */
-       if (!(
-       #if !defined(HAVE_NTFS_MNT_RDONLY)
-           (sacl_offset != 0 && sacl_offset == size - sizeof(wimlib_ACL)) ||
-       #endif
-           (dacl_offset != 0 && dacl_offset == size - sizeof(wimlib_ACL))))
+        * If not, do nothing and return.  */
+       if (!((sacl_offset != 0 && sacl_offset == size - sizeof(wimlib_ACL)) ||
+             (dacl_offset != 0 && dacl_offset == size - sizeof(wimlib_ACL))))
                return NULL;
 
        owner_offset = le32_to_cpu(desc->owner_offset);
@@ -426,15 +416,24 @@ ntfs_3g_set_metadata(ntfs_inode *ni, const struct wim_inode *inode,
                desc_size = sd->sizes[inode->i_security_id];
 
                ret = ntfs_3g_set_security_descriptor(ni, desc, desc_size);
-               if (ret) {
-                       if (wimlib_print_errors) {
-                               ERROR_WITH_ERRNO("Failed to set security descriptor "
-                                                "on \"%s\" in NTFS volume",
-                                                dentry_full_path(one_dentry));
+
+               if (unlikely(ret)) {
+                       int err = errno;
+                       ERROR_WITH_ERRNO("Failed to set security descriptor on "
+                                        "\"%s\" in NTFS volume",
+                                        dentry_full_path(one_dentry));
+                       if (err == EINVAL && wimlib_print_errors) {
                                fprintf(wimlib_error_file,
                                        "The security descriptor is: ");
                                print_byte_field(desc, desc_size, wimlib_error_file);
                                fprintf(wimlib_error_file, "\n");
+                               fprintf(wimlib_error_file,
+                                       "\nThis error occurred because libntfs-3g thinks "
+                                       "the security descriptor is invalid.  If you "
+                                       "are extracting a Windows 10 image, this may be "
+                                       "caused by a known bug in libntfs-3g.  See: "
+                                       "http://wimlib.net/forums/viewtopic.php?f=1&t=4 "
+                                       "for more information.\n\n");
                        }
                        return ret;
                }