Reviewed-by: Jaben Carsey <[email protected]>
> -----Original Message----- > From: edk2-devel [mailto:[email protected]] On Behalf Of > Ruiyu Ni > Sent: Tuesday, November 22, 2016 6:58 PM > To: [email protected] > Cc: Carsey, Jaben <[email protected]>; Chen, Chen A > <[email protected]> > Subject: [edk2] [PATCH] ShellPkg/MV: Fix MV to deny moving parent of > current directory > Importance: High > > From: Chen A Chen <[email protected]> > > 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 <[email protected]> > Cc: Jaben Carsey <[email protected]> > --- > ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c | 81 > ++++++++++++++++++++++-- > 1 file changed, 75 insertions(+), 6 deletions(-) > > diff --git a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c > b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c > index efaaeb2..71e4336 100644 > --- a/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c > +++ b/ShellPkg/Library/UefiShellLevel2CommandsLib/Mv.c > @@ -58,6 +58,73 @@ IsBetweenFileSystem( > } > > /** > + 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; > + } > } > > // > -- > 2.9.0.windows.1 > > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

