* grub-core/kern/efi/efi.c (grub_efi_get_filename): Avoid inefficient
realloc.
This commit is contained in:
parent
9a021c5580
commit
fa9b3dcae2
2 changed files with 41 additions and 29 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2013-11-01 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* grub-core/kern/efi/efi.c (grub_efi_get_filename): Avoid inefficient
|
||||||
|
realloc.
|
||||||
|
|
||||||
2013-11-01 Vladimir Serbinenko <phcoder@gmail.com>
|
2013-11-01 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* util/grub-mkrescue.in: Do not use UUID search on EFI.
|
* util/grub-mkrescue.in: Do not use UUID search on EFI.
|
||||||
|
|
|
@ -309,7 +309,34 @@ grub_efi_modules_addr (void)
|
||||||
char *
|
char *
|
||||||
grub_efi_get_filename (grub_efi_device_path_t *dp)
|
grub_efi_get_filename (grub_efi_device_path_t *dp)
|
||||||
{
|
{
|
||||||
char *name = 0;
|
char *name = 0, *p;
|
||||||
|
grub_size_t filesize = 0;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
grub_efi_uint8_t type = GRUB_EFI_DEVICE_PATH_TYPE (dp);
|
||||||
|
grub_efi_uint8_t subtype = GRUB_EFI_DEVICE_PATH_SUBTYPE (dp);
|
||||||
|
|
||||||
|
if (type == GRUB_EFI_END_DEVICE_PATH_TYPE)
|
||||||
|
break;
|
||||||
|
if (type == GRUB_EFI_MEDIA_DEVICE_PATH_TYPE
|
||||||
|
&& subtype == GRUB_EFI_FILE_PATH_DEVICE_PATH_SUBTYPE)
|
||||||
|
{
|
||||||
|
grub_efi_uint16_t len;
|
||||||
|
len = ((GRUB_EFI_DEVICE_PATH_LENGTH (dp) - 4)
|
||||||
|
/ sizeof (grub_efi_char16_t));
|
||||||
|
filesize += GRUB_MAX_UTF8_PER_UTF16 * len + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
dp = GRUB_EFI_NEXT_DEVICE_PATH (dp);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!filesize)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
p = name = grub_malloc (filesize);
|
||||||
|
if (!name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
@ -323,45 +350,25 @@ grub_efi_get_filename (grub_efi_device_path_t *dp)
|
||||||
{
|
{
|
||||||
grub_efi_file_path_device_path_t *fp;
|
grub_efi_file_path_device_path_t *fp;
|
||||||
grub_efi_uint16_t len;
|
grub_efi_uint16_t len;
|
||||||
char *p;
|
|
||||||
grub_size_t size;
|
|
||||||
|
|
||||||
if (name)
|
if (p != name)
|
||||||
{
|
*p++ = '/';
|
||||||
size = grub_strlen (name);
|
|
||||||
name[size] = '/';
|
|
||||||
size++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
size = 0;
|
|
||||||
|
|
||||||
len = ((GRUB_EFI_DEVICE_PATH_LENGTH (dp) - 4)
|
len = ((GRUB_EFI_DEVICE_PATH_LENGTH (dp) - 4)
|
||||||
/ sizeof (grub_efi_char16_t));
|
/ sizeof (grub_efi_char16_t));
|
||||||
p = grub_realloc (name, size + len * 4 + 1);
|
|
||||||
if (! p)
|
|
||||||
{
|
|
||||||
grub_free (name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
name = p;
|
|
||||||
fp = (grub_efi_file_path_device_path_t *) dp;
|
fp = (grub_efi_file_path_device_path_t *) dp;
|
||||||
*grub_utf16_to_utf8 ((grub_uint8_t *) name + size,
|
p = (char *) grub_utf16_to_utf8 ((unsigned char *) p, fp->path_name, len);
|
||||||
fp->path_name, len) = '\0';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dp = GRUB_EFI_NEXT_DEVICE_PATH (dp);
|
dp = GRUB_EFI_NEXT_DEVICE_PATH (dp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name)
|
*p = '\0';
|
||||||
{
|
|
||||||
/* EFI breaks paths with backslashes. */
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
for (p = name; *p; p++)
|
/* EFI breaks paths with backslashes. */
|
||||||
if (*p == '\\')
|
for (p = name; *p; p++)
|
||||||
*p = '/';
|
if (*p == '\\')
|
||||||
}
|
*p = '/';
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue