sys: FspFileNodeSetFileInfo: make CcSetFileSizes failures benign

tst: fscrash: test huge allocation size failures
This commit is contained in:
Bill Zissimopoulos
2016-11-06 17:15:07 -08:00
parent 31c40d017d
commit aa2d70d8de
6 changed files with 145 additions and 31 deletions

View File

@ -68,7 +68,7 @@ static VOID Test(PWSTR Prefix)
wsprintfW(FileName, L"%s\\fscrash\\file0", Prefix);
Handle = CreateFileW(FileName,
GENERIC_ALL, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, 0);
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
ASSERT(INVALID_HANDLE_VALUE != Handle);
Success = CloseHandle(Handle);
ASSERT(Success);
@ -76,7 +76,7 @@ static VOID Test(PWSTR Prefix)
wsprintfW(FileName, L"%s\\fscrash\\file0", Prefix);
Handle = CreateFileW(FileName,
GENERIC_ALL, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, 0);
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
ASSERT(INVALID_HANDLE_VALUE != Handle);
Success = WriteFile(Handle, WrBuffer, sizeof WrBuffer, &BytesTransferred, 0);
@ -205,7 +205,7 @@ static NTSTATUS CreateTestProcess(PWSTR GlobalRoot, PWSTR Prefix, PHANDLE PProce
}
ULONG OptCrashMask = -1, OptCrashFlags = FspCrashInterceptAccessViolation, OptCrashPercent = 10;
ULONG OptMemfsFlags = MemfsDisk;
ULONG OptMemfsFlags = MemfsDisk, OptFileInfoTimeout = 0;
ULONG OptIterations = -1;
PWSTR OptPrefix = 0;
@ -227,14 +227,19 @@ int wmain(int argc, wchar_t **argv)
OptCrashMask = wcstoul(a + sizeof "--mask=" - 1, 0, 0);
else if (0 == wcscmp(L"--crash", a))
{
OptCrashFlags &= ~FspCrashInterceptTerminate;
OptCrashFlags &= ~FspCrashInterceptMask;
OptCrashFlags |= FspCrashInterceptAccessViolation;
}
else if (0 == wcscmp(L"--terminate", a))
{
OptCrashFlags &= ~FspCrashInterceptAccessViolation;
OptCrashFlags &= ~FspCrashInterceptMask;
OptCrashFlags |= FspCrashInterceptTerminate;
}
else if (0 == wcscmp(L"--huge-alloc-size", a))
{
OptCrashFlags &= ~FspCrashInterceptMask;
OptCrashFlags |= FspCrashInterceptHugeAllocationSize;
}
else if (0 == wcscmp(L"--enter", a))
OptCrashFlags |= FspCrashInterceptEnter;
else if (0 == wcscmp(L"--leave", a))
@ -245,10 +250,19 @@ int wmain(int argc, wchar_t **argv)
OptMemfsFlags = MemfsDisk;
else if (0 == wcscmp(L"--net", a))
OptMemfsFlags = MemfsNet;
else if (0 == wcscmp(L"--non-cached", a))
OptFileInfoTimeout = 0;
else if (0 == wcscmp(L"--cached", a))
OptFileInfoTimeout = -1;
else if (0 == wcsncmp(L"--iterations=", a, sizeof "--iterations=" - 1))
OptIterations = wcstoul(a + sizeof "--iterations=" - 1, 0, 10);
else if (0 == wcsncmp(L"--run-test=", a, sizeof "--run-test=" - 1))
OptPrefix = a + sizeof "--run-test=" - 1;
else
{
fail("unknown option %S", a);
exit(2);
}
}
}
@ -261,7 +275,7 @@ int wmain(int argc, wchar_t **argv)
Result = MemfsCreate(
OptMemfsFlags,
0,
OptFileInfoTimeout,
1024,
1024 * 1024,
(MemfsNet & OptMemfsFlags) ? L"\\memfs\\share" : 0,

View File

@ -19,13 +19,14 @@
static SRWLOCK FspCrashLock = SRWLOCK_INIT;
static FSP_FILE_SYSTEM *FspCrashFileSystem;
static BOOLEAN FspCrashInterceptFlag;
static ULONG FspCrashPercent;
static FSP_FILE_SYSTEM_OPERATION *FspCrashInterceptedOperations
[ARRAYSIZE(((FSP_FILE_SYSTEM *)0)->Operations)];
static volatile PULONG FspCrashNullPointer;
static unsigned FspCrashRandSeed = 1;
static int FspCrashRand(void)
static __forceinline int FspCrashRand(void)
{
/*
* This mimics MSVCRT rand(); we need our own version
@ -40,55 +41,93 @@ static __forceinline BOOLEAN FspCrashInterceptTest(FSP_FILE_SYSTEM *FileSystem)
{
BOOLEAN Result;
AcquireSRWLockShared(&FspCrashLock);
Result = FileSystem == FspCrashFileSystem &&
FspCrashRand() < (LONG)FspCrashPercent * 0x7fff / 100;
Result = FspCrashInterceptFlag ||
(FileSystem == FspCrashFileSystem &&
FspCrashRand() < (LONG)FspCrashPercent * 0x7fff / 100);
FspCrashInterceptFlag = FspCrashInterceptFlag || Result;
ReleaseSRWLockShared(&FspCrashLock);
return Result;
}
#define DefineInterceptor(NAME, CRASH, ENTER, LEAVE)\
#define DefineInterceptor(NAME, ACTION, ENTER, LEAVE)\
static NTSTATUS NAME(FSP_FILE_SYSTEM *FileSystem,\
FSP_FSCTL_TRANSACT_REQ *Request, FSP_FSCTL_TRANSACT_RSP *Response)\
{\
NTSTATUS Result;\
if (ENTER)\
{\
if (FspCrashInterceptTest(FileSystem))\
switch (ACTION)\
{\
if (CRASH)\
default:\
case FspCrashInterceptAccessViolation:\
if (FspCrashInterceptTest(FileSystem))\
*FspCrashNullPointer = 0x42424242;\
else\
break;\
case FspCrashInterceptTerminate:\
if (FspCrashInterceptTest(FileSystem))\
TerminateProcess(GetCurrentProcess(), STATUS_UNSUCCESSFUL);\
break;\
case FspCrashInterceptHugeAllocationSize:\
break;\
}\
}\
Result = FspCrashInterceptedOperations[Request->Kind](FileSystem, Request, Response);\
if (LEAVE)\
{\
if (FspCrashInterceptTest(FileSystem))\
switch (ACTION)\
{\
if (CRASH)\
default:\
case FspCrashInterceptAccessViolation:\
if (FspCrashInterceptTest(FileSystem))\
*FspCrashNullPointer = 0x42424242;\
else\
break;\
case FspCrashInterceptTerminate:\
if (FspCrashInterceptTest(FileSystem))\
TerminateProcess(GetCurrentProcess(), STATUS_UNSUCCESSFUL);\
break;\
case FspCrashInterceptHugeAllocationSize:\
if (FspCrashInterceptTest(FileSystem))\
if (STATUS_SUCCESS == Response->IoStatus.Status)\
{\
if (FspFsctlTransactCreateKind == Request->Kind)\
Response->Rsp.Create.Opened.FileInfo.AllocationSize = HugeAllocationSize;\
else if (FspFsctlTransactOverwriteKind == Request->Kind)\
Response->Rsp.Overwrite.FileInfo.AllocationSize = HugeAllocationSize;\
else if (FspFsctlTransactQueryInformationKind == Request->Kind)\
Response->Rsp.QueryInformation.FileInfo.AllocationSize = HugeAllocationSize;\
else if (FspFsctlTransactSetInformationKind == Request->Kind &&\
(4/*Basic*/ == Request->Req.SetInformation.FileInformationClass ||\
19/*Allocation*/ == Request->Req.SetInformation.FileInformationClass ||\
20/*EndOfFile*/ == Request->Req.SetInformation.FileInformationClass))\
Response->Rsp.SetInformation.FileInfo.AllocationSize = HugeAllocationSize;\
else if (FspFsctlTransactWriteKind == Request->Kind &&\
!Request->Req.Write.ConstrainedIo)\
Response->Rsp.Write.FileInfo.AllocationSize = HugeAllocationSize;\
}\
break;\
}\
}\
return Result;\
}
DefineInterceptor(FspCrashInterceptorCE, TRUE, TRUE, FALSE)
DefineInterceptor(FspCrashInterceptorCL, TRUE, FALSE, TRUE)
DefineInterceptor(FspCrashInterceptorCB, TRUE, TRUE, TRUE)
DefineInterceptor(FspCrashInterceptorTE, FALSE, TRUE, FALSE)
DefineInterceptor(FspCrashInterceptorTL, FALSE, FALSE, TRUE)
DefineInterceptor(FspCrashInterceptorTB, FALSE, TRUE, TRUE)
#define HugeAllocationSize 0x1000000000000000ULL
DefineInterceptor(FspCrashInterceptorCE, FspCrashInterceptAccessViolation, TRUE, FALSE)
DefineInterceptor(FspCrashInterceptorCL, FspCrashInterceptAccessViolation, FALSE, TRUE)
DefineInterceptor(FspCrashInterceptorCB, FspCrashInterceptAccessViolation, TRUE, TRUE)
DefineInterceptor(FspCrashInterceptorTE, FspCrashInterceptTerminate, TRUE, FALSE)
DefineInterceptor(FspCrashInterceptorTL, FspCrashInterceptTerminate, FALSE, TRUE)
DefineInterceptor(FspCrashInterceptorTB, FspCrashInterceptTerminate, TRUE, TRUE)
DefineInterceptor(FspCrashInterceptorAB, FspCrashInterceptHugeAllocationSize, TRUE, TRUE)
VOID FspCrashIntercept(FSP_FILE_SYSTEM *FileSystem,
ULONG CrashMask, ULONG CrashFlags, ULONG CrashPercent)
{
FSP_FILE_SYSTEM_OPERATION *Interceptor = 0;
if (CrashFlags & FspCrashInterceptAccessViolation)
switch (CrashFlags & FspCrashInterceptMask)
{
default:
case FspCrashInterceptAccessViolation:
if (FspCrashInterceptEnter == (CrashFlags & FspCrashInterceptEnter))
Interceptor = FspCrashInterceptorCE;
else
@ -96,9 +135,8 @@ VOID FspCrashIntercept(FSP_FILE_SYSTEM *FileSystem,
Interceptor = FspCrashInterceptorCL;
else
Interceptor = FspCrashInterceptorCB;
}
else
{
break;
case FspCrashInterceptTerminate:
if (FspCrashInterceptEnter == (CrashFlags & FspCrashInterceptEnter))
Interceptor = FspCrashInterceptorTE;
else
@ -106,6 +144,10 @@ VOID FspCrashIntercept(FSP_FILE_SYSTEM *FileSystem,
Interceptor = FspCrashInterceptorTL;
else
Interceptor = FspCrashInterceptorTB;
break;
case FspCrashInterceptHugeAllocationSize:
Interceptor = FspCrashInterceptorAB;
break;
}
RtlCopyMemory(FspCrashInterceptedOperations,

View File

@ -26,8 +26,10 @@ extern "C" {
enum
{
FspCrashInterceptAccessViolation = 0x01,
FspCrashInterceptTerminate = 0x02,
FspCrashInterceptMask = 0x0f,
FspCrashInterceptAccessViolation = 0x00,
FspCrashInterceptTerminate = 0x01,
FspCrashInterceptHugeAllocationSize = 0x02,
FspCrashInterceptEnter = 0x10,
FspCrashInterceptLeave = 0x20,
};