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); 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--) { for (i=pathlen; i>0; i--) {
if (bootpath[i] == '\\') if (bootpath[i] == '\\' && bootpath[i-1] != '\\')
break; break;
} }
if (bootpath[i] == '\\')
bootpath[i+1] = '\0';
else
bootpath[0] = '\0';
bootpath[i+1] = '\0'; while (*ImagePath == '\\')
ImagePath++;
if (i == 0 || bootpath[i-i] == '\\')
bootpath[i] = '\0';
*PathName = AllocatePool(StrSize(bootpath) + StrSize(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); *grubpath = FileDevicePath(device, *PathName);
error: error:
FreePool(bootpath);
return efi_status; return efi_status;
} }