mirror of
https://github.com/winfsp/winfsp.git
synced 2025-06-08 04:52:10 -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;
|
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;
|
||||||
|
17
src/sys/ea.c
17
src/sys/ea.c
@ -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;
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user