sys: FspUnicodePathIsValid()

This commit is contained in:
Bill Zissimopoulos 2016-02-10 11:37:28 -08:00
parent cc19ddcd92
commit 5d26211c38
3 changed files with 39 additions and 1 deletions

View File

@ -338,6 +338,7 @@ ULONG FspHashMixPointer(PVOID Pointer)
/* utility */
PVOID FspAllocMustSucceed(SIZE_T Size);
PVOID FspAllocateIrpMustSucceed(CCHAR StackSize);
BOOLEAN FspUnicodePathIsValid(PUNICODE_STRING Path, BOOLEAN AllowStreams);
VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE_STRING Suffix);
NTSTATUS FspCreateGuid(GUID *Guid);
NTSTATUS FspCcSetFileSizes(PFILE_OBJECT FileObject, PCC_FILE_SIZES FileSizes);

View File

@ -809,6 +809,9 @@ static NTSTATUS FspFsvolSetRenameInformation(
if (FileNode->IsRootDirectory)
/* cannot rename root directory */
return STATUS_INVALID_PARAMETER;
if (!FspUnicodePathIsValid(&FileNode->FileName, FALSE))
/* cannot rename streams (WinFsp limitation) */
return STATUS_INVALID_PARAMETER;
if (0 != TargetFileNode)
{
@ -831,6 +834,13 @@ static NTSTATUS FspFsvolSetRenameInformation(
if (L'\\' == Suffix.Buffer[0])
FspUnicodePathSuffix(&Suffix, &NewFileName, &Suffix);
if (!FspUnicodePathIsValid(&Remain, FALSE) || !FspUnicodePathIsValid(&Suffix, FALSE))
{
/* cannot rename streams (WinFsp limitation) */
Result = STATUS_INVALID_PARAMETER;
goto unlock_exit;
}
AppendBackslash = sizeof(WCHAR) < Remain.Length;
NewFileName.Length = NewFileName.MaximumLength =
Remain.Length + AppendBackslash * sizeof(WCHAR) + Suffix.Length;

View File

@ -6,6 +6,7 @@
#include <sys/driver.h>
BOOLEAN FspUnicodePathIsValid(PUNICODE_STRING Path, BOOLEAN AllowStreams);
VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE_STRING Suffix);
NTSTATUS FspCreateGuid(GUID *Guid);
VOID FspInitializeSynchronousWorkItem(FSP_SYNCHRONOUS_WORK_ITEM *SynchronousWorkItem,
@ -18,6 +19,7 @@ VOID FspQueueDelayedWorkItem(FSP_DELAYED_WORK_ITEM *DelayedWorkItem, LARGE_INTEG
static KDEFERRED_ROUTINE FspQueueDelayedWorkItemDPC;
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FspUnicodePathIsValid)
#pragma alloc_text(PAGE, FspUnicodePathSuffix)
#pragma alloc_text(PAGE, FspCreateGuid)
#pragma alloc_text(PAGE, FspInitializeSynchronousWorkItem)
@ -69,6 +71,31 @@ PVOID FspAllocateIrpMustSucceed(CCHAR StackSize)
}
}
BOOLEAN FspUnicodePathIsValid(PUNICODE_STRING Path, BOOLEAN AllowStreams)
{
PAGED_CODE();
PWSTR PathBgn, PathEnd, PathPtr;
PathBgn = Path->Buffer;
PathEnd = (PWSTR)((PUINT8)PathBgn + Path->Length);
PathPtr = PathBgn;
while (PathEnd > PathPtr)
if (L'\\' == *PathPtr)
{
PathPtr++;
if (PathEnd > PathPtr && L'\\' == *PathPtr)
return FALSE;
}
else if (!AllowStreams && L':' == *PathPtr)
return FALSE;
else
PathPtr++;
return TRUE;
}
VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE_STRING Suffix)
{
PAGED_CODE();
@ -86,7 +113,7 @@ VOID FspUnicodePathSuffix(PUNICODE_STRING Path, PUNICODE_STRING Remain, PUNICODE
if (L'\\' == *PathPtr)
{
RemainEnd = PathPtr++;
for (; L'\\' == *PathPtr; PathPtr++)
for (; PathEnd > PathPtr && L'\\' == *PathPtr; PathPtr++)
;
SuffixBgn = PathPtr;
}