sys: ea: return STATUS_EA_CORRUPT_ERROR when appropriate

This commit is contained in:
Bill Zissimopoulos 2019-03-19 11:15:14 -07:00
parent 5c42377c1b
commit 02a650f8d0
No known key found for this signature in database
GPG Key ID: 3D4F95D52C7B3EA3
3 changed files with 23 additions and 0 deletions

View File

@ -1288,6 +1288,7 @@ typedef struct FSP_FILE_NODE
ULONG StreamInfoChangeNumber; ULONG StreamInfoChangeNumber;
UINT64 Ea; UINT64 Ea;
ULONG EaChangeNumber; ULONG EaChangeNumber;
ULONG EaChangeCount;
BOOLEAN TruncateOnClose; BOOLEAN TruncateOnClose;
FILE_LOCK FileLock; FILE_LOCK FileLock;
#if (NTDDI_VERSION < NTDDI_WIN8) #if (NTDDI_VERSION < NTDDI_WIN8)
@ -1327,6 +1328,7 @@ typedef struct
UINT64 DirInfo; UINT64 DirInfo;
ULONG DirInfoCacheHint; ULONG DirInfoCacheHint;
ULONG EaIndex; ULONG EaIndex;
ULONG EaChangeCount;
/* stream support */ /* stream support */
HANDLE MainFileHandle; HANDLE MainFileHandle;
PFILE_OBJECT MainFileObject; PFILE_OBJECT MainFileObject;

View File

@ -285,6 +285,7 @@ static VOID FspFsvolQueryEaCopy(
PAGED_CODE(); PAGED_CODE();
PFILE_OBJECT FileObject = IrpSp->FileObject; PFILE_OBJECT FileObject = IrpSp->FileObject;
FSP_FILE_NODE *FileNode = FileObject->FsContext;
FSP_FILE_DESC *FileDesc = FileObject->FsContext2; FSP_FILE_DESC *FileDesc = FileObject->FsContext2;
BOOLEAN RestartScan = BooleanFlagOn(IrpSp->Flags, SL_RESTART_SCAN); BOOLEAN RestartScan = BooleanFlagOn(IrpSp->Flags, SL_RESTART_SCAN);
BOOLEAN IndexSpecified = BooleanFlagOn(IrpSp->Flags, SL_INDEX_SPECIFIED); BOOLEAN IndexSpecified = BooleanFlagOn(IrpSp->Flags, SL_INDEX_SPECIFIED);
@ -293,6 +294,8 @@ static VOID FspFsvolQueryEaCopy(
ULONG EaListLength = IrpSp->Parameters.QueryEa.EaListLength; ULONG EaListLength = IrpSp->Parameters.QueryEa.EaListLength;
ULONG EaIndex; ULONG EaIndex;
ASSERT(FileNode == FileDesc->FileNode);
if (0 != EaList) if (0 != EaList)
{ {
FspFsvolQueryEaGetCopy( FspFsvolQueryEaGetCopy(
@ -305,6 +308,15 @@ static VOID FspFsvolQueryEaCopy(
} }
else else
{ {
if (!IndexSpecified &&
!RestartScan &&
0 != FileDesc->EaIndex &&
FileNode->EaChangeCount != FileDesc->EaChangeCount)
{
IoStatus->Status = STATUS_EA_CORRUPT_ERROR;
IoStatus->Information = 0;
return;
}
if (IndexSpecified) if (IndexSpecified)
EaIndex = IrpSp->Parameters.QueryEa.EaIndex; EaIndex = IrpSp->Parameters.QueryEa.EaIndex;
else if (RestartScan) else if (RestartScan)
@ -319,7 +331,10 @@ static VOID FspFsvolQueryEaCopy(
DstBufBgn, DstSize, DstBufBgn, DstSize,
IoStatus); IoStatus);
if (NT_SUCCESS(IoStatus->Status) || STATUS_BUFFER_OVERFLOW == IoStatus->Status) if (NT_SUCCESS(IoStatus->Status) || STATUS_BUFFER_OVERFLOW == IoStatus->Status)
{
FileDesc->EaIndex = EaIndex; FileDesc->EaIndex = EaIndex;
FileDesc->EaChangeCount = FileNode->EaChangeCount;
}
} }
} }
@ -576,6 +591,8 @@ NTSTATUS FspFsvolSetEaComplete(
FspFileNodeSetEa(FileNode, 0, 0); FspFileNodeSetEa(FileNode, 0, 0);
} }
FileNode->EaChangeCount++;
FspFileNodeNotifyChange(FileNode, FILE_NOTIFY_CHANGE_EA, FILE_ACTION_MODIFIED, FALSE); FspFileNodeNotifyChange(FileNode, FILE_NOTIFY_CHANGE_EA, FILE_ACTION_MODIFIED, FALSE);
FspIopRequestContext(Request, RequestFileNode) = 0; FspIopRequestContext(Request, RequestFileNode) = 0;

View File

@ -645,6 +645,10 @@ static void ea_check_ea2(HANDLE Handle)
} Ea; } Ea;
struct ea_check_ea_context Context; struct ea_check_ea_context Context;
memset(&Context, 0, sizeof Context);
Result = NtQueryEaFile(Handle, &Iosb, &Ea, sizeof Ea, FALSE, 0, 0, 0, FALSE);
ASSERT(STATUS_EA_CORRUPT_ERROR == Result);
memset(&Context, 0, sizeof Context); memset(&Context, 0, sizeof Context);
Result = NtQueryEaFile(Handle, &Iosb, &Ea, sizeof Ea, FALSE, 0, 0, 0, TRUE); Result = NtQueryEaFile(Handle, &Iosb, &Ea, sizeof Ea, FALSE, 0, 0, 0, TRUE);
ASSERT(STATUS_SUCCESS == Result); ASSERT(STATUS_SUCCESS == Result);