From dbc2589731ff5c6879745be8be5c5bf46844a4ef Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 15 Nov 2012 23:13:17 -0500 Subject: [PATCH] Windows: SetFileRenameInfo Improve Error Handling If a Target FileObject is not provided by the IOManager and a Target RootDirectory Handle is provided something has gone wrong. Return STATUS_INVALID_PARAMETER to indicate the invalid state. If the target directory is not specified by FileObject and a full target path is provided return STATUS_NOT_SAME_DEVICE to force an object Move instead of Rename. Change-Id: I54c3c978c0b9fcc3d4b61fb9f7b7d0771e38f714 Reviewed-on: http://gerrit.openafs.org/8477 Reviewed-by: Rod Widdowson Tested-by: BuildBot Reviewed-by: Jeffrey Altman --- src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp | 69 +++++++++++++++++---- 1 file changed, 58 insertions(+), 11 deletions(-) diff --git a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp index 3353256df..25d4b792c 100644 --- a/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp +++ b/src/WINNT/afsrdr/kernel/lib/AFSFileInfo.cpp @@ -2155,8 +2155,9 @@ AFSSetRenameInfo( IN PIRP Irp) AFSCcb *pSrcCcb = NULL, *pTargetDirCcb = NULL; PFILE_OBJECT pSrcFileObj = pIrpSp->FileObject; PFILE_OBJECT pTargetFileObj = pIrpSp->Parameters.SetFile.FileObject; + PFILE_OBJECT pTargetParentFileObj = NULL; PFILE_RENAME_INFORMATION pRenameInfo = NULL; - UNICODE_STRING uniTargetName, uniSourceName; + UNICODE_STRING uniTargetName, uniSourceName, uniTargetParentName; BOOLEAN bReplaceIfExists = FALSE; UNICODE_STRING uniShortName; AFSDirectoryCB *pTargetDirEntry = NULL; @@ -2166,10 +2167,11 @@ AFSSetRenameInfo( IN PIRP Irp) AFSObjectInfoCB *pSrcParentObject = NULL, *pTargetParentObject = NULL; AFSFileID stNewFid, stTmpTargetFid; ULONG ulNotificationAction = 0, ulNotifyFilter = 0; - UNICODE_STRING uniFullTargetPath; + UNICODE_STRING uniFullTargetName; BOOLEAN bCommonParent = FALSE; BOOLEAN bReleaseTargetDirLock = FALSE; BOOLEAN bReleaseSourceDirLock = FALSE; + BOOLEAN bDereferenceTargetParentObject = FALSE; PERESOURCE pSourceDirLock = NULL; LONG lCount; @@ -2237,19 +2239,58 @@ AFSSetRenameInfo( IN PIRP Irp) if( pTargetFileObj == NULL) { - // - // This is a simple rename. Here the target directory is the same as the source parent directory - // and the name is retrieved from the system buffer information - // - pRenameInfo = (PFILE_RENAME_INFORMATION)Irp->AssociatedIrp.SystemBuffer; - pTargetParentObject = pSrcParentObject; + if ( pRenameInfo->RootDirectory) + { - pTargetDcb = pTargetParentObject->Fcb; + AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_ERROR, + "AFSSetRenameInfo Handle provided but no FileObject ntStatus INVALID_PARAMETER\n"); + + try_return( ntStatus = STATUS_INVALID_PARAMETER); + } + else + { + + uniFullTargetName.Length = (USHORT)pRenameInfo->FileNameLength; + + uniFullTargetName.Buffer = (PWSTR)&pRenameInfo->FileName; + + AFSRetrieveFinalComponent( &uniFullTargetName, + &uniTargetName); + + AFSRetrieveParentPath( &uniFullTargetName, + &uniTargetParentName); + + if ( uniTargetParentName.Length == 0) + { + + // + // This is a simple rename. Here the target directory is the same as the source parent directory + // and the name is retrieved from the system buffer information + // + + pTargetParentObject = pSrcParentObject; + } + else + { + // + // uniTargetParentName contains the directory the renamed object + // will be moved to. Must obtain the TargetParentObject. + // - uniTargetName.Length = (USHORT)pRenameInfo->FileNameLength; - uniTargetName.Buffer = (PWSTR)&pRenameInfo->FileName; + AFSDbgLogMsg( AFS_SUBSYSTEM_FILE_PROCESSING, + AFS_TRACE_LEVEL_ERROR, + "AFSSetRenameInfo Attempt to move %wZ to %wZ -- not yet supported (NOT_SAME_DEVICE)\n", + &pSrcCcb->DirectoryCB->NameInformation.FileName, + &uniFullTargetName); + + try_return( ntStatus = STATUS_NOT_SAME_DEVICE); + } + } + + pTargetDcb = pTargetParentObject->Fcb; } else { @@ -2751,6 +2792,12 @@ try_exit: } } + if ( bDereferenceTargetParentObject) + { + + ObDereferenceObject( pTargetParentFileObj); + } + return ntStatus; } -- 2.39.5