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