[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