[ntfs-3g] add windows 8 unsafe mount prevention code
Tom Callaway
spot at fedoraproject.org
Thu Oct 4 20:20:38 UTC 2012
commit bc0a4204f880c2ca35ebbbeebd46db7beb243aa9
Author: Tom Callaway <spot at fedoraproject.org>
Date: Thu Oct 4 16:21:30 2012 -0400
add windows 8 unsafe mount prevention code
...-4d0b9163c9ef1f0cdbbf533317b291220c7fd1c7.patch | 42 ++++++++
...-559270a8f67c77a7ce51246c23d2b2837bcff0c9.patch | 109 ++++++++++++++++++++
ntfs-3g.spec | 13 ++-
3 files changed, 163 insertions(+), 1 deletions(-)
---
diff --git a/ntfs-3g-4d0b9163c9ef1f0cdbbf533317b291220c7fd1c7.patch b/ntfs-3g-4d0b9163c9ef1f0cdbbf533317b291220c7fd1c7.patch
new file mode 100644
index 0000000..ec1a762
--- /dev/null
+++ b/ntfs-3g-4d0b9163c9ef1f0cdbbf533317b291220c7fd1c7.patch
@@ -0,0 +1,42 @@
+From 4d0b9163c9ef1f0cdbbf533317b291220c7fd1c7 Mon Sep 17 00:00:00 2001
+From: =?utf8?q?Jean-Pierre=20Andr=C3=A9?= <jpandre at users.sourceforge.net>
+Date: Wed, 12 Sep 2012 09:42:24 +0200
+Subject: [PATCH] Accepted processing restart pages v 2.0 with no warning (used by Windows 8)
+
+In the $LogFile, Windows 8 defines restart pages with version 2.0.
+The checks designed for version 1.1 appear to apply, so accept v 2.0
+and apply the usual checks.
+---
+ libntfs-3g/logfile.c | 15 +++++++++------
+ 1 files changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/libntfs-3g/logfile.c b/libntfs-3g/logfile.c
+index a4f00d5..83811fa 100644
+--- a/libntfs-3g/logfile.c
++++ b/libntfs-3g/logfile.c
+@@ -84,13 +84,16 @@ static BOOL ntfs_check_restart_page_header(RESTART_PAGE_HEADER *rp, s64 pos)
+ "position in $LogFile.\n");
+ return FALSE;
+ }
+- /* We only know how to handle version 1.1. */
+- if (sle16_to_cpu(rp->major_ver) != 1 ||
+- sle16_to_cpu(rp->minor_ver) != 1) {
++ /* We only know how to handle version 1.1 and 2.0. */
++ if (((rp->major_ver != const_cpu_to_le16(1))
++ || (rp->minor_ver != const_cpu_to_le16(1)))
++ && ((rp->major_ver != const_cpu_to_le16(2))
++ || (rp->minor_ver != const_cpu_to_le16(0)))) {
+ ntfs_log_error("$LogFile version %i.%i is not "
+- "supported. (This driver supports version "
+- "1.1 only.)\n", (int)sle16_to_cpu(rp->major_ver),
+- (int)sle16_to_cpu(rp->minor_ver));
++ "supported.\n (This driver supports version "
++ "1.1 and 2.0 only.)\n",
++ (int)sle16_to_cpu(rp->major_ver),
++ (int)sle16_to_cpu(rp->minor_ver));
+ return FALSE;
+ }
+ /*
+--
+1.7.4.1
+
diff --git a/ntfs-3g-559270a8f67c77a7ce51246c23d2b2837bcff0c9.patch b/ntfs-3g-559270a8f67c77a7ce51246c23d2b2837bcff0c9.patch
new file mode 100644
index 0000000..9b92298
--- /dev/null
+++ b/ntfs-3g-559270a8f67c77a7ce51246c23d2b2837bcff0c9.patch
@@ -0,0 +1,109 @@
+diff -up ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/logfile.c.559270a8 ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/logfile.c
+--- ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/logfile.c.559270a8 2012-10-04 16:14:28.439011268 -0400
++++ ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/logfile.c 2012-10-04 16:14:28.443011272 -0400
+@@ -84,7 +84,12 @@ static BOOL ntfs_check_restart_page_head
+ "position in $LogFile.\n");
+ return FALSE;
+ }
+- /* We only know how to handle version 1.1 and 2.0. */
++ /*
++ * We only know how to handle version 1.1 and 2.0, though
++ * version 2.0 is probably related to cached metadata in
++ * Windows 8, and we will refuse to mount.
++ * Nevertheless, do all the relevant checks before rejecting.
++ */
+ if (((rp->major_ver != const_cpu_to_le16(1))
+ || (rp->minor_ver != const_cpu_to_le16(1)))
+ && ((rp->major_ver != const_cpu_to_le16(2))
+diff -up ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/volume.c.559270a8 ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/volume.c
+--- ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/volume.c.559270a8 2012-01-15 08:26:14.000000000 -0500
++++ ntfs-3g_ntfsprogs-2012.1.15/libntfs-3g/volume.c 2012-10-04 16:16:55.324071714 -0400
+@@ -89,13 +89,9 @@ static const char *corrupt_volume_msg =
+ "for more details.\n";
+
+ static const char *hibernated_volume_msg =
+-"The NTFS partition is hibernated. Please resume and shutdown Windows\n"
+-"properly, or mount the volume read-only with the 'ro' mount option, or\n"
+-"mount the volume read-write with the 'remove_hiberfile' mount option.\n"
+-"For example type on the command line:\n"
+-"\n"
+-" mount -t ntfs-3g -o remove_hiberfile %s %s\n"
+-"\n";
++"The NTFS partition is in an unsafe state. Please resume and shutdown\n"
++"Windows fully (no hibernation or fast restarting), or mount the volume\n"
++"read-only with the 'ro' mount option.\n";
+
+ static const char *unclean_journal_msg =
+ "Write access is denied because the disk wasn't safely powered\n"
+@@ -649,6 +645,24 @@ static int ntfs_volume_check_logfile(ntf
+
+ if (!ntfs_check_logfile(na, &rp) || !ntfs_is_logfile_clean(na, rp))
+ err = EOPNOTSUPP;
++ /*
++ * If the latest restart page was identified as version
++ * 2.0, then Windows may have kept a cached copy of
++ * metadata for fast restarting, and we should not mount.
++ * Hibernation will be seen the same way on a non
++ * Windows-system partition, so we have to use the same
++ * error code (EPERM).
++ * The restart page may also be identified as version 2.0
++ * when access to the file system is terminated abruptly
++ * by unplugging or power cut, so mounting is also rejected
++ * after such an event.
++ */
++ if (rp
++ && (rp->major_ver == const_cpu_to_le16(2))
++ && (rp->minor_ver == const_cpu_to_le16(0))) {
++ ntfs_log_error("Metadata kept in Windows cache, refused to mount.\n");
++ err = EPERM;
++ }
+ free(rp);
+ ntfs_attr_close(na);
+ out:
+@@ -1200,7 +1214,8 @@ ntfs_volume *ntfs_device_mount(struct nt
+ ntfs_volume_check_hiberfile(vol, 1) < 0)
+ goto error_exit;
+ if (ntfs_volume_check_logfile(vol) < 0) {
+- if (!(flags & MS_RECOVER))
++ /* Always reject cached metadata for now */
++ if (!(flags & MS_RECOVER) || (errno == EPERM))
+ goto error_exit;
+ ntfs_log_info("The file system wasn't safely "
+ "closed on Windows. Fixing.\n");
+@@ -1642,6 +1657,10 @@ int ntfs_volume_error(int err)
+ ret = NTFS_VOLUME_CORRUPT;
+ break;
+ case EPERM:
++ /*
++ * Hibernation and fast restarting are seen the
++ * same way on a non Windows-system partition.
++ */
+ ret = NTFS_VOLUME_HIBERNATED;
+ break;
+ case EOPNOTSUPP:
+diff -up ntfs-3g_ntfsprogs-2012.1.15/src/ntfs-3g.8.in.559270a8 ntfs-3g_ntfsprogs-2012.1.15/src/ntfs-3g.8.in
+--- ntfs-3g_ntfsprogs-2012.1.15/src/ntfs-3g.8.in.559270a8 2012-01-15 08:26:14.000000000 -0500
++++ ntfs-3g_ntfsprogs-2012.1.15/src/ntfs-3g.8.in 2012-10-04 16:14:28.445011274 -0400
+@@ -36,6 +36,22 @@ a few differences mentioned below in rel
+ .PP
+ The \fIvolume\fR to be mounted can be either a block device or
+ an image file.
++.SS Windows hibernation and fast restarting
++On computers which can be dual-booted into Windows or Linux, Windows has
++to be fully shut down before booting into Linux, otherwise the NTFS file
++systems on internal disks may be left in an inconsistent state and changes
++made by Linux may be ignored by Windows.
++.P
++So, Windows may not be left in hibernation when starting Linux, in order
++to avoid inconsistencies. Moreover, the fast restart feature available on
++recent Windows systems has to be disabled. This can be achieved by issuing
++as an Administrator the Windows command which disables both
++hibernation and fast restarting :
++.RS
++.sp
++powercfg /h off
++.sp
++.RE
+ .SS Access Handling and Security
+ By default, files and directories are owned by the effective
+ user and group of the mounting process, and everybody has
diff --git a/ntfs-3g.spec b/ntfs-3g.spec
index 2578eb1..dbdac40 100644
--- a/ntfs-3g.spec
+++ b/ntfs-3g.spec
@@ -8,7 +8,7 @@
Name: ntfs-3g
Summary: Linux NTFS userspace driver
Version: 2012.1.15
-Release: 3%{?dist}
+Release: 4%{?dist}
License: GPLv2+
Group: System Environment/Base
Source0: http://tuxera.com/opensource/%{name}_ntfsprogs-%{version}%{?subver}.tgz
@@ -27,6 +27,9 @@ Obsoletes: ntfsprogs-fuse
Provides: fuse-ntfs-3g = %{epoch}:%{version}-%{release}
Patch0: ntfs-3g_ntfsprogs-2011.10.9-RC-ntfsck-unsupported-return-0.patch
Patch1: ntfs-3g-junction-point-fix.patch
+# Windows 8 safety checks
+Patch2: ntfs-3g-4d0b9163c9ef1f0cdbbf533317b291220c7fd1c7.patch
+Patch3: ntfs-3g-559270a8f67c77a7ce51246c23d2b2837bcff0c9.patch
%description
NTFS-3G is a stable, open source, GPL licensed, POSIX, read/write NTFS
@@ -69,6 +72,8 @@ included utilities see man 8 ntfsprogs after installation).
%setup -q -n %{name}_ntfsprogs-%{version}%{?subver}
%patch0 -p1 -b .unsupported
%patch1 -p1 -b .junction-fix
+%patch2 -p1 -b .4d0b9163
+%patch3 -p1 -b .559270a8
%build
CFLAGS="$RPM_OPT_FLAGS -D_FILE_OFFSET_BITS=64"
@@ -170,6 +175,12 @@ cp -a %{SOURCE1} %{buildroot}%{_datadir}/hal/fdi/policy/10osvendor/
%{_mandir}/man8/ntfs[^m][^o]*.8*
%changelog
+* Thu Oct 4 2012 Tom Callaway <spot at fedoraproject.org> - 2:2012.1.15-4
+- add patches from upstream git to add a level of safety in the case where windows 8
+ leaves the NTFS filesystem in an unsafe state and Linux access could result in data loss.
+ Basically, with these patches, Linux will refuse to mount the ntfs partition. For the details
+ refer to: https://bugzilla.redhat.com/show_bug.cgi?id=859373
+
* Sun Aug 19 2012 Tom Callaway <spot at fedoraproject.org> - 2:2012.1.15-3
- apply upstream fix for junction points (bz849332)
More information about the scm-commits
mailing list