diff --git a/ChangeLog b/ChangeLog index ce822eea1..8bd581e0a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-12-10 Paulo Flabiano Smorigo + + * grub-core/kern/ieee1275/init.c (grub_machine_get_bootlocation): Use + dynamic allocation for the bootpath buffer. + 2012-12-10 Dr. Tilmann Bubeck * grub-core/gfxmenu/view.c (init_terminal): Avoid making terminal diff --git a/grub-core/kern/ieee1275/init.c b/grub-core/kern/ieee1275/init.c index 7d03a8aac..14dcdf097 100644 --- a/grub-core/kern/ieee1275/init.c +++ b/grub-core/kern/ieee1275/init.c @@ -82,18 +82,30 @@ void (*grub_ieee1275_net_config) (const char *dev, void grub_machine_get_bootlocation (char **device, char **path) { - char bootpath[64]; /* XXX check length */ + char *bootpath; + grub_ssize_t bootpath_size; char *filename; char *type; - - if (grub_ieee1275_get_property (grub_ieee1275_chosen, "bootpath", &bootpath, - sizeof (bootpath), 0)) + + if (grub_ieee1275_get_property_length (grub_ieee1275_chosen, "bootpath", + &bootpath_size) + || bootpath_size <= 0) { /* Should never happen. */ grub_printf ("/chosen/bootpath property missing!\n"); return; } + bootpath = (char *) grub_malloc ((grub_size_t) bootpath_size + 64); + if (! bootpath) + { + grub_print_error (); + return; + } + grub_ieee1275_get_property (grub_ieee1275_chosen, "bootpath", bootpath, + (grub_size_t) bootpath_size + 1, 0); + bootpath[bootpath_size] = '\0'; + /* Transform an OF device path to a GRUB path. */ type = grub_ieee1275_get_device_type (bootpath); @@ -132,6 +144,7 @@ grub_machine_get_bootlocation (char **device, char **path) *path = filename; } } + grub_free (bootpath); } /* Claim some available memory in the first /memory node. */