]> wimlib.net Git - wimlib/blobdiff - src/ntfs-3g_capture.c
wimapply.1: fix documentation for valid Windows filenames
[wimlib] / src / ntfs-3g_capture.c
index 9d973a23439d4915c8b205439c094d767df9c116..33f8365702ecff945d14b050894f8fcc4fbfe7c8 100644 (file)
@@ -31,6 +31,7 @@
 #include <errno.h>
 
 #include <ntfs-3g/attrib.h>
+#include <ntfs-3g/compat.h> /* for ENODATA, if needed */
 #include <ntfs-3g/object_id.h>
 #include <ntfs-3g/reparse.h>
 #include <ntfs-3g/security.h>
 #include "wimlib/scan.h"
 #include "wimlib/security.h"
 
-/* NTFS-3g 2013 renamed MS_RDONLY to NTFS_MNT_RDONLY.  We can't check for the
+/* NTFS-3G 2013 renamed MS_RDONLY to NTFS_MNT_RDONLY.  We can't check for the
  * existence of NTFS_MNT_RDONLY at compilation time because it's an enum.  We
  * also can't check for MS_RDONLY being missing because it's also a system
- * constant.  So check if the NTFS-3g specific MS_IGNORE_HIBERFILE is defined;
+ * constant.  So check if the NTFS-3G specific MS_IGNORE_HIBERFILE is defined;
  * if yes, then we need to use the old MS_RDONLY.  */
 #ifdef MS_IGNORE_HIBERFILE
 #  define NTFS_MNT_RDONLY MS_RDONLY
@@ -271,7 +272,7 @@ set_attr_sort_key(ntfs_inode *ni, struct ntfs_location *loc)
 /*
  * Add a new stream to the specified inode, with duplicate checking.
  *
- * This works around a problem where NTFS-3g can list multiple unnamed data
+ * This works around a problem where NTFS-3G can list multiple unnamed data
  * streams for a single file.  In this case we can only keep one.  We'll prefer
  * one that is nonempty.
  */
@@ -753,7 +754,7 @@ ntfs_3g_build_dentry_tree_recursive(struct wim_dentry **root_ret,
        if (unlikely(attributes & FILE_ATTRIBUTE_ENCRYPTED)) {
                if (params->add_flags & WIMLIB_ADD_FLAG_NO_UNSUPPORTED_EXCLUDE)
                {
-                       ERROR("Can't archive \"%s\" because NTFS-3g capture mode "
+                       ERROR("Can't archive \"%s\" because NTFS-3G capture mode "
                              "does not support encrypted files and directories", path);
                        ret = WIMLIB_ERR_UNSUPPORTED_FILE;
                        goto out;
@@ -812,7 +813,7 @@ ntfs_3g_build_dentry_tree_recursive(struct wim_dentry **root_ret,
        if (ret)
                goto out;
 
-       /* Reparse-point fixups are a no-op because in NTFS-3g capture mode we
+       /* Reparse-point fixups are a no-op because in NTFS-3G capture mode we
         * only allow capturing an entire volume. */
        if (params->add_flags & WIMLIB_ADD_FLAG_RPFIX &&
            inode_is_symlink(inode))
@@ -877,7 +878,16 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret,
        volume->vol = vol;
        volume->refcnt = 1;
 
-       ntfs_open_secure(vol);
+       /* Currently, libntfs-3g users that need to read security descriptors
+        * are required to call ntfs_open_secure() to open the volume's security
+        * descriptor index, "$Secure".  This is only required to work on NTFS
+        * v3.0+, as older versions did not have a security descriptor index. */
+       if (ntfs_open_secure(vol) && vol->major_ver >= 3) {
+               ERROR_WITH_ERRNO("Unable to open security descriptor index of "
+                                "NTFS volume \"%s\"", device);
+               ret = WIMLIB_ERR_NTFS_3G;
+               goto out_put_ntfs_volume;
+       }
 
        /* We don't want to capture the special NTFS files such as $Bitmap.  Not
         * to be confused with "hidden" or "system" files which are real files
@@ -889,7 +899,7 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret,
        path = MALLOC(32768);
        if (!path) {
                ret = WIMLIB_ERR_NOMEM;
-               goto out_put_ntfs_volume;
+               goto out_close_secure;
        }
 
        path[0] = '/';
@@ -898,10 +908,17 @@ ntfs_3g_build_dentry_tree(struct wim_dentry **root_ret,
                                                  FILE_NAME_POSIX, volume,
                                                  params);
        FREE(path);
+out_close_secure:
+       /* Undo the effects of ntfs_open_secure().  This is not yet done
+        * automatically by ntfs_umount().  But NULL out the inode to
+        * potentially be robust against future versions doing so. */
+       if (vol->secure_ni) {
+               ntfs_index_ctx_put(vol->secure_xsii);
+               ntfs_index_ctx_put(vol->secure_xsdh);
+               ntfs_inode_close(vol->secure_ni);
+               vol->secure_ni = NULL;
+       }
 out_put_ntfs_volume:
-       ntfs_index_ctx_put(vol->secure_xsii);
-       ntfs_index_ctx_put(vol->secure_xsdh);
-       ntfs_inode_close(vol->secure_ni);
        put_ntfs_volume(volume);
        return ret;
 }