From 28c8c9190546bf1939c60eeb881076d47d0dde9c Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Sat, 28 Aug 2004 22:19:12 +0000 Subject: [PATCH] - Implement file sharing checks. svn path=/trunk/; revision=10728 --- reactos/drivers/fs/vfat/cleanup.c | 5 ++++- reactos/drivers/fs/vfat/create.c | 37 ++++++++++++++++++++++--------- reactos/drivers/fs/vfat/fcb.c | 4 +++- reactos/drivers/fs/vfat/finfo.c | 8 ++++++- reactos/drivers/fs/vfat/vfat.h | 5 ++++- 5 files changed, 44 insertions(+), 15 deletions(-) diff --git a/reactos/drivers/fs/vfat/cleanup.c b/reactos/drivers/fs/vfat/cleanup.c index 6573b98ec56..81454706b6e 100644 --- a/reactos/drivers/fs/vfat/cleanup.c +++ b/reactos/drivers/fs/vfat/cleanup.c @@ -1,4 +1,4 @@ -/* $Id: cleanup.c,v 1.14 2003/10/11 17:51:56 hbirr Exp $ +/* $Id: cleanup.c,v 1.15 2004/08/28 22:19:12 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -55,6 +55,9 @@ VfatCleanupFile(PVFAT_IRP_CONTEXT IrpContext) { CcRosReleaseFileCache (FileObject); } + + pFcb->OpenHandleCount--; + IoRemoveShareAccess(FileObject, &pFcb->FCBShareAccess); } return STATUS_SUCCESS; } diff --git a/reactos/drivers/fs/vfat/create.c b/reactos/drivers/fs/vfat/create.c index 54e5a9afc1a..6d59895c52b 100644 --- a/reactos/drivers/fs/vfat/create.c +++ b/reactos/drivers/fs/vfat/create.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: create.c,v 1.72 2004/08/05 02:48:18 navaraf Exp $ +/* $Id: create.c,v 1.73 2004/08/28 22:19:12 navaraf Exp $ * * PROJECT: ReactOS kernel * FILE: drivers/fs/vfat/create.c @@ -615,10 +615,6 @@ VfatCreateFile (PDEVICE_OBJECT DeviceObject, PIRP Irp) VfatSetExtendedAttributes(FileObject, Irp->AssociatedIrp.SystemBuffer, Stack->Parameters.Create.EaLength); - IoSetShareAccess(0 /*DesiredAccess*/, - Stack->Parameters.Create.ShareAccess, - FileObject, - &pFcb->FCBShareAccess); if (PagingFileCreate) { @@ -647,6 +643,20 @@ VfatCreateFile (PDEVICE_OBJECT DeviceObject, PIRP Irp) pFcb = FileObject->FsContext; + if (pFcb->OpenHandleCount != 0) + { + Status = IoCheckShareAccess(Stack->Parameters.Create.SecurityContext->DesiredAccess, + Stack->Parameters.Create.ShareAccess, + FileObject, + &pFcb->FCBShareAccess, + FALSE); + if (!NT_SUCCESS(Status)) + { + VfatCloseFile (DeviceExt, FileObject); + return(Status); + } + } + /* * Check the file has the requested attributes */ @@ -719,16 +729,21 @@ VfatCreateFile (PDEVICE_OBJECT DeviceObject, PIRP Irp) Irp->IoStatus.Information = FILE_SUPERSEDED; } else if (RequestedDisposition == FILE_OVERWRITE || RequestedDisposition == FILE_OVERWRITE_IF) - { - Irp->IoStatus.Information = FILE_OVERWRITTEN; - } + { + Irp->IoStatus.Information = FILE_OVERWRITTEN; + } else - { + { Irp->IoStatus.Information = FILE_OPENED; } } - - /* FIXME : test share access */ + + pFcb->OpenHandleCount++; + IoSetShareAccess(Stack->Parameters.Create.SecurityContext->DesiredAccess, + Stack->Parameters.Create.ShareAccess, + FileObject, + &pFcb->FCBShareAccess); + /* FIXME : test write access if requested */ return(Status); diff --git a/reactos/drivers/fs/vfat/fcb.c b/reactos/drivers/fs/vfat/fcb.c index 78156a5e093..afb919f38d9 100644 --- a/reactos/drivers/fs/vfat/fcb.c +++ b/reactos/drivers/fs/vfat/fcb.c @@ -1,4 +1,4 @@ -/* $Id: fcb.c,v 1.40 2004/08/01 21:57:17 navaraf Exp $ +/* $Id: fcb.c,v 1.41 2004/08/28 22:19:12 navaraf Exp $ * * * FILE: drivers/fs/vfat/fcb.c @@ -88,6 +88,8 @@ vfatInitFcb(PVFATFCB Fcb, PUNICODE_STRING NameU) Fcb->DirNameU.MaximumLength = Fcb->DirNameU.Length = 0; Fcb->LongNameU.MaximumLength = Fcb->LongNameU.Length = 0; } + RtlZeroMemory(&Fcb->FCBShareAccess, sizeof(SHARE_ACCESS)); + Fcb->OpenHandleCount = 0; } PVFATFCB diff --git a/reactos/drivers/fs/vfat/finfo.c b/reactos/drivers/fs/vfat/finfo.c index 2a2d8862447..69c067dc75d 100644 --- a/reactos/drivers/fs/vfat/finfo.c +++ b/reactos/drivers/fs/vfat/finfo.c @@ -1,4 +1,4 @@ -/* $Id: finfo.c,v 1.36 2004/08/01 21:57:18 navaraf Exp $ +/* $Id: finfo.c,v 1.37 2004/08/28 22:19:12 navaraf Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -187,6 +187,11 @@ VfatSetDispositionInformation(PFILE_OBJECT FileObject, assert (DeviceExt->FatInfo.BytesPerCluster != 0); assert (FCB != NULL); + if (FCB->entry.Attrib & FILE_ATTRIBUTE_READONLY) + { + return STATUS_CANNOT_DELETE; + } + if (vfatFCBIsRoot(FCB) || (FCB->LongNameU.Length == sizeof(WCHAR) && FCB->LongNameU.Buffer[0] == L'.') || (FCB->LongNameU.Length == 2 * sizeof(WCHAR) && FCB->LongNameU.Buffer[0] == L'.' && FCB->LongNameU.Buffer[1] == L'.')) @@ -194,6 +199,7 @@ VfatSetDispositionInformation(PFILE_OBJECT FileObject, // we cannot delete a '.', '..' or the root directory return STATUS_ACCESS_DENIED; } + if (DispositionInfo->DoDeleteFile) { if (MmFlushImageSection (FileObject->SectionObjectPointer, MmFlushForDelete)) diff --git a/reactos/drivers/fs/vfat/vfat.h b/reactos/drivers/fs/vfat/vfat.h index 7de7e856e18..4fa4834c5c3 100644 --- a/reactos/drivers/fs/vfat/vfat.h +++ b/reactos/drivers/fs/vfat/vfat.h @@ -1,4 +1,4 @@ -/* $Id: vfat.h,v 1.67 2004/08/05 02:48:18 navaraf Exp $ */ +/* $Id: vfat.h,v 1.68 2004/08/28 22:19:12 navaraf Exp $ */ #include @@ -251,6 +251,9 @@ typedef struct _VFATFCB /* Share access for the file object */ SHARE_ACCESS FCBShareAccess; + /* Incremented on IRP_MJ_CREATE, decremented on IRP_MJ_CLEANUP */ + ULONG OpenHandleCount; + /* Entry into the hash table for the path + long name */ HASHENTRY Hash;