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
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue