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