From dcef60424d01dc4cc67a27e87f7539a021a5ee21 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 14 Feb 2016 22:44:54 +0000 Subject: [PATCH] [NTFS] Cowardly refuse to continue processing (enumerating/reading) when stumbling upon a compressed entry. This avoids infinite loops when enumerating, incorrect files contents when reading. CORE-10814 #resolve #comment 'Fixed' with r70750 svn path=/trunk/; revision=70750 --- reactos/drivers/filesystems/ntfs/dirctl.c | 7 +++++++ reactos/drivers/filesystems/ntfs/fcb.c | 6 ++++++ reactos/drivers/filesystems/ntfs/ntfs.h | 3 +++ reactos/drivers/filesystems/ntfs/rw.c | 7 +++++++ 4 files changed, 23 insertions(+) diff --git a/reactos/drivers/filesystems/ntfs/dirctl.c b/reactos/drivers/filesystems/ntfs/dirctl.c index a9d16fdb12d..53e70ba8f8f 100644 --- a/reactos/drivers/filesystems/ntfs/dirctl.c +++ b/reactos/drivers/filesystems/ntfs/dirctl.c @@ -298,6 +298,13 @@ NtfsQueryDirectory(PNTFS_IRP_CONTEXT IrpContext) FileInformationClass = Stack->Parameters.QueryDirectory.FileInformationClass; FileIndex = Stack->Parameters.QueryDirectory.FileIndex; + if (NtfsFCBIsCompressed(Fcb)) + { + DPRINT1("Compressed directory!\n"); + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + if (SearchPattern != NULL) { if (!Ccb->DirectorySearchPattern) diff --git a/reactos/drivers/filesystems/ntfs/fcb.c b/reactos/drivers/filesystems/ntfs/fcb.c index 278ea3ee9df..e3ac61fa8e4 100644 --- a/reactos/drivers/filesystems/ntfs/fcb.c +++ b/reactos/drivers/filesystems/ntfs/fcb.c @@ -137,6 +137,12 @@ NtfsFCBIsReparsePoint(PNTFS_FCB Fcb) } +BOOLEAN +NtfsFCBIsCompressed(PNTFS_FCB Fcb) +{ + return ((Fcb->Entry.FileAttributes & NTFS_FILE_TYPE_COMPRESSED) == NTFS_FILE_TYPE_COMPRESSED); +} + BOOLEAN NtfsFCBIsRoot(PNTFS_FCB Fcb) { diff --git a/reactos/drivers/filesystems/ntfs/ntfs.h b/reactos/drivers/filesystems/ntfs/ntfs.h index 037bbe4e999..0ecd3159636 100644 --- a/reactos/drivers/filesystems/ntfs/ntfs.h +++ b/reactos/drivers/filesystems/ntfs/ntfs.h @@ -642,6 +642,9 @@ NtfsFCBIsDirectory(PNTFS_FCB Fcb); BOOLEAN NtfsFCBIsReparsePoint(PNTFS_FCB Fcb); +BOOLEAN +NtfsFCBIsCompressed(PNTFS_FCB Fcb); + BOOLEAN NtfsFCBIsRoot(PNTFS_FCB Fcb); diff --git a/reactos/drivers/filesystems/ntfs/rw.c b/reactos/drivers/filesystems/ntfs/rw.c index 572bd850783..13e9d86595e 100644 --- a/reactos/drivers/filesystems/ntfs/rw.c +++ b/reactos/drivers/filesystems/ntfs/rw.c @@ -71,6 +71,13 @@ NtfsReadFile(PDEVICE_EXTENSION DeviceExt, Fcb = (PNTFS_FCB)FileObject->FsContext; + if (NtfsFCBIsCompressed(Fcb)) + { + DPRINT1("Compressed file!\n"); + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + FileRecord = ExAllocatePoolWithTag(NonPagedPool, DeviceExt->NtfsInfo.BytesPerFileRecord, TAG_NTFS); if (FileRecord == NULL) {