mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-07 20:42:09 -05:00
sys: ea: return STATUS_EA_CORRUPT_ERROR when appropriate
This commit is contained in:
parent
5c42377c1b
commit
02a650f8d0
@ -1288,6 +1288,7 @@ typedef struct FSP_FILE_NODE
|
||||
ULONG StreamInfoChangeNumber;
|
||||
UINT64 Ea;
|
||||
ULONG EaChangeNumber;
|
||||
ULONG EaChangeCount;
|
||||
BOOLEAN TruncateOnClose;
|
||||
FILE_LOCK FileLock;
|
||||
#if (NTDDI_VERSION < NTDDI_WIN8)
|
||||
@ -1327,6 +1328,7 @@ typedef struct
|
||||
UINT64 DirInfo;
|
||||
ULONG DirInfoCacheHint;
|
||||
ULONG EaIndex;
|
||||
ULONG EaChangeCount;
|
||||
/* stream support */
|
||||
HANDLE MainFileHandle;
|
||||
PFILE_OBJECT MainFileObject;
|
||||
|
17
src/sys/ea.c
17
src/sys/ea.c
@ -285,6 +285,7 @@ static VOID FspFsvolQueryEaCopy(
|
||||
PAGED_CODE();
|
||||
|
||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||
FSP_FILE_NODE *FileNode = FileObject->FsContext;
|
||||
FSP_FILE_DESC *FileDesc = FileObject->FsContext2;
|
||||
BOOLEAN RestartScan = BooleanFlagOn(IrpSp->Flags, SL_RESTART_SCAN);
|
||||
BOOLEAN IndexSpecified = BooleanFlagOn(IrpSp->Flags, SL_INDEX_SPECIFIED);
|
||||
@ -293,6 +294,8 @@ static VOID FspFsvolQueryEaCopy(
|
||||
ULONG EaListLength = IrpSp->Parameters.QueryEa.EaListLength;
|
||||
ULONG EaIndex;
|
||||
|
||||
ASSERT(FileNode == FileDesc->FileNode);
|
||||
|
||||
if (0 != EaList)
|
||||
{
|
||||
FspFsvolQueryEaGetCopy(
|
||||
@ -305,6 +308,15 @@ static VOID FspFsvolQueryEaCopy(
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!IndexSpecified &&
|
||||
!RestartScan &&
|
||||
0 != FileDesc->EaIndex &&
|
||||
FileNode->EaChangeCount != FileDesc->EaChangeCount)
|
||||
{
|
||||
IoStatus->Status = STATUS_EA_CORRUPT_ERROR;
|
||||
IoStatus->Information = 0;
|
||||
return;
|
||||
}
|
||||
if (IndexSpecified)
|
||||
EaIndex = IrpSp->Parameters.QueryEa.EaIndex;
|
||||
else if (RestartScan)
|
||||
@ -319,7 +331,10 @@ static VOID FspFsvolQueryEaCopy(
|
||||
DstBufBgn, DstSize,
|
||||
IoStatus);
|
||||
if (NT_SUCCESS(IoStatus->Status) || STATUS_BUFFER_OVERFLOW == IoStatus->Status)
|
||||
{
|
||||
FileDesc->EaIndex = EaIndex;
|
||||
FileDesc->EaChangeCount = FileNode->EaChangeCount;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -576,6 +591,8 @@ NTSTATUS FspFsvolSetEaComplete(
|
||||
FspFileNodeSetEa(FileNode, 0, 0);
|
||||
}
|
||||
|
||||
FileNode->EaChangeCount++;
|
||||
|
||||
FspFileNodeNotifyChange(FileNode, FILE_NOTIFY_CHANGE_EA, FILE_ACTION_MODIFIED, FALSE);
|
||||
|
||||
FspIopRequestContext(Request, RequestFileNode) = 0;
|
||||
|
@ -645,6 +645,10 @@ static void ea_check_ea2(HANDLE Handle)
|
||||
} Ea;
|
||||
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);
|
||||
Result = NtQueryEaFile(Handle, &Iosb, &Ea, sizeof Ea, FALSE, 0, 0, 0, TRUE);
|
||||
ASSERT(STATUS_SUCCESS == Result);
|
||||
|
Loading…
x
Reference in New Issue
Block a user