mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
sys: IRP_MJ_CREATE: improve access checks logic
This commit is contained in:
parent
4a2d9295d7
commit
ab31918cec
@ -73,7 +73,7 @@ static NTSTATUS FspFsvolCreate(
|
|||||||
PSECURITY_DESCRIPTOR SecurityDescriptor = AccessState->SecurityDescriptor;
|
PSECURITY_DESCRIPTOR SecurityDescriptor = AccessState->SecurityDescriptor;
|
||||||
ULONG SecurityDescriptorSize = 0;
|
ULONG SecurityDescriptorSize = 0;
|
||||||
LARGE_INTEGER AllocationSize = Irp->Overlay.AllocationSize;
|
LARGE_INTEGER AllocationSize = Irp->Overlay.AllocationSize;
|
||||||
ACCESS_MASK DesiredAccess = AccessState->OriginalDesiredAccess;
|
ACCESS_MASK DesiredAccess = IrpSp->Parameters.Create.DesiredAccess;
|
||||||
USHORT ShareAccess = IrpSp->Parameters.Create.ShareAccess;
|
USHORT ShareAccess = IrpSp->Parameters.Create.ShareAccess;
|
||||||
PFILE_FULL_EA_INFORMATION EaBuffer = Irp->AssociatedIrp.SystemBuffer;
|
PFILE_FULL_EA_INFORMATION EaBuffer = Irp->AssociatedIrp.SystemBuffer;
|
||||||
//ULONG EaLength = IrpSp->Parameters.Create.EaLength;
|
//ULONG EaLength = IrpSp->Parameters.Create.EaLength;
|
||||||
@ -353,7 +353,7 @@ VOID FspFsvolCreateComplete(
|
|||||||
PSECURITY_DESCRIPTOR SecurityDescriptor =
|
PSECURITY_DESCRIPTOR SecurityDescriptor =
|
||||||
(PVOID)(Response->Buffer + Response->Rsp.Create.SecurityDescriptor);
|
(PVOID)(Response->Buffer + Response->Rsp.Create.SecurityDescriptor);
|
||||||
ULONG SecurityDescriptorSize = Response->Rsp.Create.SecurityDescriptorSize;
|
ULONG SecurityDescriptorSize = Response->Rsp.Create.SecurityDescriptorSize;
|
||||||
ACCESS_MASK DesiredAccess = AccessState->OriginalDesiredAccess;
|
ACCESS_MASK DesiredAccess = IrpSp->Parameters.Create.DesiredAccess;
|
||||||
USHORT ShareAccess = IrpSp->Parameters.Create.ShareAccess;
|
USHORT ShareAccess = IrpSp->Parameters.Create.ShareAccess;
|
||||||
ULONG Flags = IrpSp->Flags;
|
ULONG Flags = IrpSp->Flags;
|
||||||
KPROCESSOR_MODE RequestorMode =
|
KPROCESSOR_MODE RequestorMode =
|
||||||
@ -397,6 +397,9 @@ VOID FspFsvolCreateComplete(
|
|||||||
FspFsvolCreateClose(Irp, Response);
|
FspFsvolCreateClose(Irp, Response);
|
||||||
FSP_RETURN();
|
FSP_RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetFlag(AccessState->PreviouslyGrantedAccess, GrantedAccess);
|
||||||
|
ClearFlag(AccessState->RemainingDesiredAccess, GrantedAccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* record the user-mode file system contexts */
|
/* record the user-mode file system contexts */
|
||||||
@ -425,8 +428,8 @@ VOID FspFsvolCreateComplete(
|
|||||||
* increment its open count. There is no need to acquire the
|
* increment its open count. There is no need to acquire the
|
||||||
* FsContext's Resource (because it is newly created).
|
* FsContext's Resource (because it is newly created).
|
||||||
*/
|
*/
|
||||||
IoSetShareAccess(DesiredAccess, ShareAccess, FileObject,
|
IoSetShareAccess(AccessState->PreviouslyGrantedAccess,
|
||||||
&FsContext->ShareAccess);
|
ShareAccess, FileObject, &FsContext->ShareAccess);
|
||||||
FspFileContextOpen(FsContext);
|
FspFileContextOpen(FsContext);
|
||||||
Result = STATUS_SUCCESS;
|
Result = STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -441,8 +444,8 @@ VOID FspFsvolCreateComplete(
|
|||||||
if (FsContext->DeletePending)
|
if (FsContext->DeletePending)
|
||||||
Result = STATUS_DELETE_PENDING;
|
Result = STATUS_DELETE_PENDING;
|
||||||
else
|
else
|
||||||
Result = IoCheckShareAccess(DesiredAccess, ShareAccess, FileObject,
|
Result = IoCheckShareAccess(AccessState->PreviouslyGrantedAccess,
|
||||||
&FsContext->ShareAccess, TRUE);
|
ShareAccess, FileObject, &FsContext->ShareAccess, TRUE);
|
||||||
if (NT_SUCCESS(Result))
|
if (NT_SUCCESS(Result))
|
||||||
FspFileContextOpen(FsContext);
|
FspFileContextOpen(FsContext);
|
||||||
ExReleaseResourceLite(FsContext->Header.Resource);
|
ExReleaseResourceLite(FsContext->Header.Resource);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user