--- trunk/reactos/drivers/fs/vfat/create.c 2005-11-24 18:05:53 UTC (rev 19534)
+++ trunk/reactos/drivers/fs/vfat/create.c 2005-11-24 21:08:13 UTC (rev 19535)
@@ -337,9 +337,11 @@
return Status;
}
+static
NTSTATUS
VfatOpenFile (
PDEVICE_EXTENSION DeviceExt,
+ PUNICODE_STRING PathNameU,
PFILE_OBJECT FileObject,
PVFATFCB* ParentFcb )
/*
@@ -348,10 +350,8 @@
{
PVFATFCB Fcb;
NTSTATUS Status;
- UNICODE_STRING PathNameU;
- WCHAR Buffer[260];
- DPRINT ("VfatOpenFile(%08lx, %08lx, '%wZ')\n", DeviceExt, FileObject, &FileObject->FileName);
+ DPRINT ("VfatOpenFile(%08lx, '%wZ', %08lx, %08lx)\n", DeviceExt, PathNameU, FileObject, ParentFcb);
if (FileObject->RelatedFileObject)
{
@@ -403,21 +403,10 @@
(*ParentFcb)->RefCount++;
}
- PathNameU.Buffer = Buffer;
- PathNameU.Length = 0;
- PathNameU.MaximumLength = sizeof(Buffer);
- RtlCopyUnicodeString(&PathNameU, &FileObject->FileName);
- if (PathNameU.Length > sizeof(WCHAR) &&
- PathNameU.Buffer[PathNameU.Length / sizeof(WCHAR) - 1] == L'\\')
- {
- PathNameU.Length -= sizeof(WCHAR);
- }
- PathNameU.Buffer[PathNameU.Length / sizeof(WCHAR)] = 0;
-
/* try first to find an existing FCB in memory */
DPRINT ("Checking for existing FCB in memory\n");
- Status = vfatGetFCBForFile (DeviceExt, ParentFcb, &Fcb, &PathNameU);
+ Status = vfatGetFCBForFile (DeviceExt, ParentFcb, &Fcb, PathNameU);
if (!NT_SUCCESS (Status))
{
DPRINT ("Could not make a new FCB, status: %x\n", Status);
@@ -456,6 +445,7 @@
LARGE_INTEGER AllocationSize;
BOOLEAN Dots;
UNICODE_STRING FileNameU;
+ UNICODE_STRING PathNameU;
/* Unpack the various parameters. */
Stack = IoGetCurrentIrpStackLocation (Irp);
@@ -473,6 +463,12 @@
return(STATUS_INVALID_PARAMETER);
}
+ if (RequestedOptions & FILE_DIRECTORY_FILE &&
+ RequestedOptions & FILE_NON_DIRECTORY_FILE)
+ {
+ return(STATUS_INVALID_PARAMETER);
+ }
+
/* This a open operation for the volume itself */
if (FileObject->FileName.Length == 0 &&
FileObject->RelatedFileObject == NULL)
@@ -506,12 +502,13 @@
/*
* Check for illegal characters and illegale dot sequences in the file name
*/
- c = FileObject->FileName.Buffer + FileObject->FileName.Length / sizeof(WCHAR);
+ PathNameU = FileObject->FileName;
+ c = PathNameU.Buffer + PathNameU.Length / sizeof(WCHAR);
last = c - 1;
Dots = TRUE;
- while (c-- > FileObject->FileName.Buffer)
+ while (c-- > PathNameU.Buffer)
{
- if (*c == L'\\' || c == FileObject->FileName.Buffer)
+ if (*c == L'\\' || c == PathNameU.Buffer)
{
if (Dots && last > c)
{
@@ -530,9 +527,22 @@
return(STATUS_OBJECT_NAME_INVALID);
}
}
+ if (FileObject->RelatedFileObject && PathNameU.Buffer[0] == L'\\')
+ {
+ return(STATUS_OBJECT_NAME_INVALID);
+ }
+ if (PathNameU.Length > sizeof(WCHAR) && PathNameU.Buffer[PathNameU.Length/sizeof(WCHAR)-1] == L'\\')
+ {
+ if (!(RequestedOptions & FILE_DIRECTORY_FILE))
+ {
+ /* FIXME: Is this the right error message? */
+ return(STATUS_OBJECT_NAME_INVALID);
+ }
+ PathNameU.Length -= sizeof(WCHAR);
+ }
/* Try opening the file. */
- Status = VfatOpenFile (DeviceExt, FileObject, &ParentFcb);
+ Status = VfatOpenFile (DeviceExt, &PathNameU, FileObject, &ParentFcb);
/*
* If the directory containing the file to open doesn't exist then
@@ -562,7 +572,7 @@
ULONG Attributes;
Attributes = Stack->Parameters.Create.FileAttributes;
- vfatSplitPathName(&FileObject->FileName, NULL, &FileNameU);
+ vfatSplitPathName(&PathNameU, NULL, &FileNameU);
Status = VfatAddEntry (DeviceExt, &FileNameU, &pFcb, ParentFcb, RequestedOptions,
(UCHAR)(Attributes & FILE_ATTRIBUTE_VALID_FLAGS));
vfatReleaseFCB (DeviceExt, ParentFcb);