From: Anton Altaparmakov Date: Mon, 4 Apr 2005 15:20:14 +0000 (+0100) Subject: NTFS: Some utilities modify the boot sector but do not update the checksum. X-Git-Tag: v2.6.13-rc4~89^2~26 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0d2374d62faed034dd80e6524efb98a6341597c;p=linux-2.6 NTFS: Some utilities modify the boot sector but do not update the checksum. Thus, relax the checking in fs/ntfs/super.c::is_boot_sector_ntfs() to only emit a warning when the checksum is incorrect rather than refusing the mount. Thanks to Bernd Casimir for pointing this problem out. Signed-off-by: Anton Altaparmakov --- diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog index 51428bfce9..8ff6ea778f 100644 --- a/fs/ntfs/ChangeLog +++ b/fs/ntfs/ChangeLog @@ -105,6 +105,11 @@ ToDo/Notes: non-resident by a concurrent file write. - Remove checks for NULL before calling kfree() since kfree() does the checking itself. (Jesper Juhl) + - Some utilities modify the boot sector but do not update the checksum. + Thus, relax the checking in fs/ntfs/super.c::is_boot_sector_ntfs() to + only emit a warning when the checksum is incorrect rather than + refusing the mount. Thanks to Bernd Casimir for pointing this + problem out. 2.1.22 - Many bug and race fixes and error handling improvements. diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index 25fa1d1668..6f752ea765 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c @@ -38,6 +38,7 @@ #include "debug.h" #include "index.h" #include "aops.h" +#include "layout.h" #include "malloc.h" #include "ntfs.h" @@ -532,16 +533,19 @@ static BOOL is_boot_sector_ntfs(const struct super_block *sb, { /* * Check that checksum == sum of u32 values from b to the checksum - * field. If checksum is zero, no checking is done. + * field. If checksum is zero, no checking is done. We will work when + * the checksum test fails, since some utilities update the boot sector + * ignoring the checksum which leaves the checksum out-of-date. We + * report a warning if this is the case. */ - if ((void*)b < (void*)&b->checksum && b->checksum) { + if ((void*)b < (void*)&b->checksum && b->checksum && !silent) { le32 *u; u32 i; for (i = 0, u = (le32*)b; u < (le32*)(&b->checksum); ++u) i += le32_to_cpup(u); if (le32_to_cpu(b->checksum) != i) - goto not_ntfs; + ntfs_warning(sb, "Invalid boot sector checksum."); } /* Check OEMidentifier is "NTFS " */ if (b->oem_id != magicNTFS) @@ -591,7 +595,7 @@ static BOOL is_boot_sector_ntfs(const struct super_block *sb, * many BIOSes will refuse to boot from a bootsector if the magic is * incorrect, so we emit a warning. */ - if (!silent && b->end_of_sector_marker != cpu_to_le16(0xaa55)) + if (!silent && b->end_of_sector_marker != const_cpu_to_le16(0xaa55)) ntfs_warning(sb, "Invalid end of sector marker."); return TRUE; not_ntfs: