mirror of https://github.com/acidanthera/audk.git
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:
parent
7bbe0b3eff
commit
0db4acb61a
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
Loading…
Reference in New Issue