sys: IRP_MJ_CREATE: improve access checks logic

This commit is contained in:
Bill Zissimopoulos 2015-12-05 12:37:09 -08:00
parent 4a2d9295d7
commit ab31918cec

View File

@ -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);