Fix the broken bootpath

- The file path from DevicePathToStr may use slash as the file
  seperator. Change all slashes to backslashes to avoid the strange
  bootpath.
- Remove the redundant backslashes.
- ImagePath no longer requires the leading backslash.
- Fix a memory leak

Based on the patch from Michal Marek <mmarek@suse.com>
This commit is contained in:
Gary Ching-Pang Lin 2013-09-26 11:58:01 -04:00 committed by Peter Jones
parent 908eacc225
commit f9f81a22dd

22
shim.c
View File

@ -995,15 +995,25 @@ static EFI_STATUS generate_path(EFI_LOADED_IMAGE *li, CHAR16 *ImagePath,
pathlen = StrLen(bootpath);
/*
* DevicePathToStr() concatenates two nodes with '/'.
* Convert '/' to '\\'.
*/
for (i = 0; i < pathlen; i++) {
if (bootpath[i] == '/')
bootpath[i] = '\\';
}
for (i=pathlen; i>0; i--) {
if (bootpath[i] == '\\')
if (bootpath[i] == '\\' && bootpath[i-1] != '\\')
break;
}
if (bootpath[i] == '\\')
bootpath[i+1] = '\0';
else
bootpath[0] = '\0';
bootpath[i+1] = '\0';
if (i == 0 || bootpath[i-i] == '\\')
bootpath[i] = '\0';
while (*ImagePath == '\\')
ImagePath++;
*PathName = AllocatePool(StrSize(bootpath) + StrSize(ImagePath));
@ -1021,6 +1031,8 @@ static EFI_STATUS generate_path(EFI_LOADED_IMAGE *li, CHAR16 *ImagePath,
*grubpath = FileDevicePath(device, *PathName);
error:
FreePool(bootpath);
return efi_status;
}