From 25154ca7c1ce08a1a8ff16b57d8e1349653ea4c9 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 8 Dec 2015 00:06:24 -0800 Subject: [PATCH] sys: FspFsvolCreateClose, FspFsvolCleanup, FspFsvolClose --- src/sys/cleanup.c | 24 +++++++++++++++++------- src/sys/close.c | 29 +++++++++++++++++------------ src/sys/create.c | 8 +++++--- 3 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/sys/cleanup.c b/src/sys/cleanup.c index 0b9335b1..0d12c16a 100644 --- a/src/sys/cleanup.c +++ b/src/sys/cleanup.c @@ -60,6 +60,8 @@ static NTSTATUS FspFsvolCleanup( FspFsvrtDeviceExtension(FsvrtDeviceObject); PFILE_OBJECT FileObject = IrpSp->FileObject; FSP_FILE_CONTEXT *FsContext = FileObject->FsContext; + UINT64 UserContext = FsContext->UserContext; + UINT64 UserContext2 = (UINT_PTR)FileObject->FsContext2; BOOLEAN FileNameRequired = 0 != FsvrtDeviceExtension->VolumeParams.FileNameRequired; BOOLEAN DeletePending; LONG OpenCount; @@ -101,11 +103,7 @@ static NTSTATUS FspFsvolCleanup( /* create the user-mode file system request */ Result = FspIopCreateRequest(Irp, FileNameRequired ? &FsContext->FileName : 0, 0, &Request); if (!NT_SUCCESS(Result)) - { - /* IRP_MJ_CLEANUP cannot really fail :-\ */ - Result = STATUS_SUCCESS; - goto exit; - } + goto leak_exit; /* * The new request is associated with our IRP and will be deleted during its completion. @@ -113,12 +111,24 @@ static NTSTATUS FspFsvolCleanup( /* populate the Cleanup request */ Request->Kind = FspFsctlTransactCleanupKind; - Request->Req.Cleanup.UserContext = FsContext->UserContext; - Request->Req.Cleanup.UserContext2 = (UINT_PTR)FileObject->FsContext2; + Request->Req.Cleanup.UserContext = UserContext; + Request->Req.Cleanup.UserContext2 = UserContext2; Request->Req.Cleanup.Delete = DeletePending && 0 == OpenCount; Result = STATUS_PENDING; + goto exit; + + leak_exit:; +#if DBG + DEBUGLOG("FileObject=%p[%p:\"%wZ\"], UserContext=%llx, UserContext2=%p: " + "error: the user-mode file system handle will be leaked!", + IrpSp->FileObject, IrpSp->FileObject->RelatedFileObject, IrpSp->FileObject->FileName, + UserContext, UserContext2); +#endif + /* IRP_MJ_CLEANUP cannot really fail :-\ */ + Result = STATUS_SUCCESS; + exit:; } finally diff --git a/src/sys/close.c b/src/sys/close.c index 64ab3f5a..e1e84ea5 100644 --- a/src/sys/close.c +++ b/src/sys/close.c @@ -60,6 +60,8 @@ static NTSTATUS FspFsvolClose( FspFsvrtDeviceExtension(FsvrtDeviceObject); PFILE_OBJECT FileObject = IrpSp->FileObject; FSP_FILE_CONTEXT *FsContext = FileObject->FsContext; + UINT64 UserContext = FsContext->UserContext; + UINT64 UserContext2 = (UINT_PTR)FileObject->FsContext2; BOOLEAN FileNameRequired = 0 != FsvrtDeviceExtension->VolumeParams.FileNameRequired; FSP_FSCTL_TRANSACT_REQ *Request; @@ -69,11 +71,7 @@ static NTSTATUS FspFsvolClose( /* create the user-mode file system request */ Result = FspIopCreateRequest(0, FileNameRequired ? &FsContext->FileName : 0, 0, &Request); if (!NT_SUCCESS(Result)) - { - /* IRP_MJ_CLOSE cannot really fail :-\ */ - Result = STATUS_SUCCESS; - goto exit; - } + goto leak_exit; /* * The new request is associated with our IRP and will be deleted during its completion. @@ -81,19 +79,26 @@ static NTSTATUS FspFsvolClose( /* populate the Close request */ Request->Kind = FspFsctlTransactCloseKind; - Request->Req.Close.UserContext = FsContext->UserContext; - Request->Req.Close.UserContext2 = (UINT_PTR)FileObject->FsContext2; + Request->Req.Close.UserContext = UserContext; + Request->Req.Close.UserContext2 = UserContext2; /* post as a work request; this allows us to complete our own IRP and return immediately! */ if (!FspIopPostWorkRequest(DeviceObject, Request)) - { /* no need to delete the request here as FspIopPostWorkRequest() will do so in all cases */ + goto leak_exit; - /* IRP_MJ_CLOSE cannot really fail :-\ */ - Result = STATUS_SUCCESS; - goto exit; - } + Result = STATUS_SUCCESS; + goto exit; + + leak_exit:; +#if DBG + DEBUGLOG("FileObject=%p[%p:\"%wZ\"], UserContext=%llx, UserContext2=%p: " + "error: the user-mode file system handle will be leaked!", + IrpSp->FileObject, IrpSp->FileObject->RelatedFileObject, IrpSp->FileObject->FileName, + UserContext, UserContext2); +#endif + /* IRP_MJ_CLOSE cannot really fail :-\ */ Result = STATUS_SUCCESS; exit:; diff --git a/src/sys/create.c b/src/sys/create.c index 13252d69..07319721 100644 --- a/src/sys/create.c +++ b/src/sys/create.c @@ -680,6 +680,8 @@ static VOID FspFsvolCreateClose( FspFsvrtDeviceExtension(FsvolDeviceExtension->FsvrtDeviceObject); PFILE_OBJECT FileObject = IrpSp->FileObject; FSP_FILE_CONTEXT *FsContext = FileObject->FsContext; + UINT64 UserContext = FsContext->UserContext; + UINT64 UserContext2 = (UINT_PTR)FileObject->FsContext2; BOOLEAN FileNameRequired = 0 != FsvrtDeviceExtension->VolumeParams.FileNameRequired; FSP_FSCTL_TRANSACT_REQ *Request; @@ -690,8 +692,8 @@ static VOID FspFsvolCreateClose( /* populate the CreateCleanupClose request */ Request->Kind = FspFsctlTransactCreateCleanupCloseKind; - Request->Req.Cleanup.UserContext = FsContext->UserContext; - Request->Req.Cleanup.UserContext2 = (UINT_PTR)FileObject->FsContext2; + Request->Req.Cleanup.UserContext = UserContext; + Request->Req.Cleanup.UserContext2 = UserContext2; Request->Req.Cleanup.Delete = FILE_CREATED == Response->IoStatus.Information; /* post as a work request */ @@ -706,7 +708,7 @@ leak_exit:; DEBUGLOG("FileObject=%p[%p:\"%wZ\"], UserContext=%llx, UserContext2=%p: " "error: the user-mode file system handle will be leaked!", IrpSp->FileObject, IrpSp->FileObject->RelatedFileObject, IrpSp->FileObject->FileName, - FsContext->UserContext, FileObject->FsContext2); + UserContext, UserContext2); #endif exit: