From 5bdfac970413fa1331ad938cf562bed0e343f121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Pierre=20Andr=C3=A9?= Date: Mon, 17 May 2021 15:35:51 +0300 Subject: [PATCH] Added generic checks of MFT records in ntfsfix Before acting on MFT, make sure it passes the consistency check. --- ntfsprogs/ntfsfix.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ntfsprogs/ntfsfix.c b/ntfsprogs/ntfsfix.c index 6801e70e..48e8a782 100644 --- a/ntfsprogs/ntfsfix.c +++ b/ntfsprogs/ntfsfix.c @@ -823,7 +823,8 @@ static BOOL short_mft_selfloc_condition(struct MFT_SELF_LOCATED *selfloc) vol->mft_record_size, mft0) == vol->mft_record_size) && !ntfs_mst_post_read_fixup((NTFS_RECORD*)mft0, - vol->mft_record_size)) { + vol->mft_record_size) + && !ntfs_mft_record_check(vol, 0, mft0)) { a = find_unnamed_attr(mft0,AT_DATA); if (a && a->non_resident @@ -961,7 +962,9 @@ static BOOL self_mapped_selfloc_condition(struct MFT_SELF_LOCATED *selfloc) if ((ntfs_pread(vol->dev, offs, vol->mft_record_size, mft1) == vol->mft_record_size) && !ntfs_mst_post_read_fixup((NTFS_RECORD*)mft1, - vol->mft_record_size)) { + vol->mft_record_size) + && !ntfs_mft_record_check(vol, inum, mft1)) { + lowest_vcn = (SELFLOC_LIMIT*vol->mft_record_size) >> vol->cluster_size_bits; a = find_unnamed_attr(mft1,AT_DATA); @@ -1017,7 +1020,8 @@ static BOOL spare_record_selfloc_condition(struct MFT_SELF_LOCATED *selfloc) if ((ntfs_pread(vol->dev, offs, vol->mft_record_size, mft2) == vol->mft_record_size) && !ntfs_mst_post_read_fixup((NTFS_RECORD*)mft2, - vol->mft_record_size)) { + vol->mft_record_size) + && !ntfs_mft_record_check(vol, inum, mft2)) { if (!mft2->base_mft_record && (mft2->flags & MFT_RECORD_IN_USE) && !find_unnamed_attr(mft2,AT_ATTRIBUTE_LIST)