MdePkg/BaseLib: Fix PathCleanUpDirectories to correctly handle "\.\"

The old code incorrectly cleans path like "fs0:\abc\.\.." to
"fs0:\abc", instead of "fs0:\"

The patch fixes this bug.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Chen A Chen <chen.a.chen@intel.com>
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
This commit is contained in:
Ruiyu Ni 2016-12-21 15:21:32 +08:00
parent af8ba51aca
commit bb99e3282c
1 changed files with 25 additions and 35 deletions

View File

@ -68,61 +68,51 @@ CHAR16*
EFIAPI EFIAPI
PathCleanUpDirectories( PathCleanUpDirectories(
IN CHAR16 *Path IN CHAR16 *Path
) )
{ {
CHAR16 *TempString; CHAR16 *TempString;
UINTN TempSize;
if (Path==NULL) { if (Path == NULL) {
return(NULL); return NULL;
} }
// //
// Fix up the '/' vs '\' // Replace the '/' with '\'
// //
for (TempString = Path ; TempString != NULL && *TempString != CHAR_NULL ; TempString++) { for (TempString = Path; *TempString != CHAR_NULL; TempString++) {
if (*TempString == L'/') { if (*TempString == L'/') {
*TempString = L'\\'; *TempString = L'\\';
} }
} }
// //
// Fix up the .. // Remove all the "\.". E.g.: fs0:\abc\.\def\.
// //
while ((TempString = StrStr(Path, L"\\..\\")) != NULL) { while ((TempString = StrStr (Path, L"\\.\\")) != NULL) {
*TempString = CHAR_NULL; CopyMem (TempString, TempString + 2, StrSize (TempString + 2));
TempString += 4;
PathRemoveLastItem(Path);
TempSize = StrSize(TempString);
CopyMem(Path+StrLen(Path), TempString, TempSize);
} }
if ((TempString = StrStr(Path, L"\\..")) != NULL && *(TempString + 3) == CHAR_NULL) { if (StrCmp (Path + StrLen (Path) - 2, L"\\.") == 0) {
*TempString = CHAR_NULL; Path[StrLen (Path) - 1] = CHAR_NULL;
if (!PathRemoveLastItem(Path)) {
*TempString = L'\\';
}
} }
// //
// Fix up the . // Remove all the "\..". E.g.: fs0:\abc\..\def\..
// //
while ((TempString = StrStr(Path, L"\\.\\")) != NULL) { while (((TempString = StrStr(Path, L"\\..")) != NULL) &&
*TempString = CHAR_NULL; ((*(TempString + 3) == L'\\') || (*(TempString + 3) == CHAR_NULL))
TempString += 2; ) {
TempSize = StrSize(TempString);
CopyMem(Path+StrLen(Path), TempString, TempSize);
}
if ((TempString = StrStr(Path, L"\\.")) != NULL && *(TempString + 2) == CHAR_NULL) {
*(TempString + 1) = CHAR_NULL; *(TempString + 1) = CHAR_NULL;
PathRemoveLastItem(Path);
CopyMem (Path + StrLen (Path), TempString + 3, StrSize (TempString + 3));
} }
while ((TempString = StrStr(Path, L"\\\\")) != NULL) { //
*TempString = CHAR_NULL; // Replace the "\\" with "\"
TempString += 1; //
TempSize = StrSize(TempString); while ((TempString = StrStr (Path, L"\\\\")) != NULL) {
CopyMem(Path+StrLen(Path), TempString, TempSize); CopyMem (TempString, TempString + 1, StrSize (TempString + 1));
}
if ((TempString = StrStr(Path, L"\\\\")) != NULL && *(TempString + 1) == CHAR_NULL) {
*(TempString) = CHAR_NULL;
} }
return (Path); return Path;
} }