ShellPkg/MV: Fix MV to deny moving parent of current directory

When user types "mv -r fs0:\A\ fs1:\" under directory
"fs0:\A\B\", MV command should deny such movement.

The patch fixes the above issue.
It also denies moving current directory.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
Chen A Chen 2016-11-22 16:16:02 +08:00 committed by Ruiyu Ni
parent 7bbe0b3eff
commit 0db4acb61a
1 changed files with 75 additions and 6 deletions

View File

@ -57,6 +57,73 @@ IsBetweenFileSystem(
return (FALSE);
}
/**
function to determine if SrcPath is valid to mv.
if SrcPath equal CWD then it's invalid.
if SrcPath is the parent path of CWD then it's invalid.
is SrcPath is NULL return FALSE.
if CwdPath is NULL then ASSERT()
@param SrcPath [in] The source path.
@param CwdPath [in] The current working directory.
@retval TRUE The source path is valid.
@retval FALSE The source path is invalid.
**/
BOOLEAN
IsSoucePathValid(
IN CONST CHAR16* SrcPath,
IN CONST CHAR16* CwdPath
)
{
CHAR16* SrcPathBuffer;
CHAR16* CwdPathBuffer;
BOOLEAN Ret;
ASSERT (CwdPath != NULL);
if (SrcPath == NULL) {
return FALSE;
}
Ret = TRUE;
SrcPathBuffer = AllocateCopyPool (StrSize (SrcPath), SrcPath);
if (SrcPathBuffer == NULL) {
return FALSE;
}
CwdPathBuffer = AllocateCopyPool (StrSize (CwdPath), CwdPath);
if (CwdPathBuffer == NULL) {
FreePool(SrcPathBuffer);
return FALSE;
}
gUnicodeCollation->StrUpr (gUnicodeCollation, SrcPathBuffer);
gUnicodeCollation->StrUpr (gUnicodeCollation, CwdPathBuffer);
if (SrcPathBuffer[StrLen (SrcPathBuffer) -1 ] == L'\\') {
SrcPathBuffer[StrLen (SrcPathBuffer) - 1] = CHAR_NULL;
}
if (CwdPathBuffer[StrLen (CwdPathBuffer) - 1] == L'\\') {
CwdPathBuffer[StrLen (CwdPathBuffer) - 1] = CHAR_NULL;
}
if (StrCmp (CwdPathBuffer, SrcPathBuffer) == 0 ||
((StrStr (CwdPathBuffer, SrcPathBuffer) == CwdPathBuffer) &&
(CwdPathBuffer[StrLen (SrcPathBuffer)] == L'\\'))
) {
Ret = FALSE;
}
FreePool (SrcPathBuffer);
FreePool (CwdPathBuffer);
return Ret;
}
/**
Function to validate that moving a specific file (FileName) to a specific
location (DestPath) is valid.
@ -90,12 +157,14 @@ IsValidMove(
CHAR16 *DestPathCopy;
CHAR16 *DestPathWalker;
if (Cwd != NULL && StrCmp(SourcePath, Cwd) == 0) {
//
// Invalid move
//
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MV_INV_CWD), gShellLevel2HiiHandle);
return (FALSE);
if ((Cwd != NULL) && ((Attribute & EFI_FILE_DIRECTORY) == EFI_FILE_DIRECTORY)) {
if (!IsSoucePathValid (SourcePath, Cwd)) {
//
// Invalid move
//
ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_MV_INV_CWD), gShellLevel2HiiHandle);
return FALSE;
}
}
//