* include/grub/ieee1275/ieee1275.h (IEEE1275_MAX_PROP_LEN,

IEEE1275_MAX_PATH_LEN): Define.
	* kern/ieee1275/openfw.c (grub_children_iterate): Dynamically
	allocate 'childtype', 'childpath', 'childname', and 'fullname'.
	(grub_devalias_iterate): Dynamically allocate 'aliasname' and
	'devtype'.  Explicitly NULL terminate devalias expansion.
This commit is contained in:
davem 2009-04-22 09:46:54 +00:00
parent f01005a832
commit 4e8269dad2
3 changed files with 65 additions and 9 deletions

View file

@ -3,6 +3,13 @@
* kern/ieee1275/mmap.c (grub_machine_mmap_iterate): If size_cells
is larger than address_cells, use that value for address_cells too.
* include/grub/ieee1275/ieee1275.h (IEEE1275_MAX_PROP_LEN,
IEEE1275_MAX_PATH_LEN): Define.
* kern/ieee1275/openfw.c (grub_children_iterate): Dynamically
allocate 'childtype', 'childpath', 'childname', and 'fullname'.
(grub_devalias_iterate): Dynamically allocate 'aliasname' and
'devtype'. Explicitly NULL terminate devalias expansion.
2009-04-19 Vladimir Serbinenko <phcoder@gmail.com>
Correct GPT definition

View file

@ -39,6 +39,9 @@ struct grub_ieee1275_mem_region
unsigned int size;
};
#define IEEE1275_MAX_PROP_LEN 8192
#define IEEE1275_MAX_PATH_LEN 256
#ifndef IEEE1275_CALL_ENTRY_FN
#define IEEE1275_CALL_ENTRY_FN(args) (*grub_ieee1275_entry_fn) (args)
#endif

View file

@ -38,6 +38,8 @@ grub_children_iterate (char *devpath,
{
grub_ieee1275_phandle_t dev;
grub_ieee1275_phandle_t child;
char *childtype, *childpath;
char *childname, *fullname;
if (grub_ieee1275_finddevice (devpath, &dev))
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "Unknown device");
@ -45,13 +47,33 @@ grub_children_iterate (char *devpath,
if (grub_ieee1275_child (dev, &child))
return grub_error (GRUB_ERR_BAD_DEVICE, "Device has no children");
childtype = grub_malloc (IEEE1275_MAX_PROP_LEN);
if (!childtype)
return grub_errno;
childpath = grub_malloc (IEEE1275_MAX_PATH_LEN);
if (!childpath)
{
grub_free (childtype);
return grub_errno;
}
childname = grub_malloc (IEEE1275_MAX_PROP_LEN);
if (!childname)
{
grub_free (childpath);
grub_free (childtype);
return grub_errno;
}
fullname = grub_malloc (IEEE1275_MAX_PATH_LEN);
if (!fullname)
{
grub_free (childname);
grub_free (childpath);
grub_free (childtype);
return grub_errno;
}
do
{
/* XXX: Don't use hardcoded path lengths. */
char childtype[64];
char childpath[64];
char childname[64];
char fullname[64];
struct grub_ieee1275_devalias alias;
grub_ssize_t actual;
@ -76,6 +98,11 @@ grub_children_iterate (char *devpath,
}
while (grub_ieee1275_peer (child, &child));
grub_free (fullname);
grub_free (childname);
grub_free (childpath);
grub_free (childtype);
return 0;
}
@ -85,13 +112,23 @@ grub_err_t
grub_devalias_iterate (int (*hook) (struct grub_ieee1275_devalias *alias))
{
grub_ieee1275_phandle_t aliases;
char aliasname[32];
char *aliasname, *devtype;
grub_ssize_t actual;
struct grub_ieee1275_devalias alias;
if (grub_ieee1275_finddevice ("/aliases", &aliases))
return -1;
aliasname = grub_malloc (IEEE1275_MAX_PROP_LEN);
if (!aliasname)
return grub_errno;
devtype = grub_malloc (IEEE1275_MAX_PROP_LEN);
if (!devtype)
{
grub_free (aliasname);
return grub_errno;
}
/* Find the first property. */
aliasname[0] = '\0';
@ -100,8 +137,6 @@ grub_devalias_iterate (int (*hook) (struct grub_ieee1275_devalias *alias))
grub_ieee1275_phandle_t dev;
grub_ssize_t pathlen;
char *devpath;
/* XXX: This should be large enough for any possible case. */
char devtype[64];
grub_dprintf ("devalias", "devalias name = %s\n", aliasname);
@ -111,9 +146,17 @@ grub_devalias_iterate (int (*hook) (struct grub_ieee1275_devalias *alias))
if (!grub_strcmp (aliasname, "name"))
continue;
/* Sun's OpenBoot often doesn't zero terminate the device alias
strings, so we will add a NULL byte at the end explicitly. */
pathlen += 1;
devpath = grub_malloc (pathlen);
if (! devpath)
return grub_errno;
{
grub_free (devtype);
grub_free (aliasname);
return grub_errno;
}
if (grub_ieee1275_get_property (aliases, aliasname, devpath, pathlen,
&actual))
@ -121,6 +164,7 @@ grub_devalias_iterate (int (*hook) (struct grub_ieee1275_devalias *alias))
grub_dprintf ("devalias", "get_property (%s) failed\n", aliasname);
goto nextprop;
}
devpath [actual] = '\0';
if (grub_ieee1275_finddevice (devpath, &dev))
{
@ -144,6 +188,8 @@ nextprop:
grub_free (devpath);
}
grub_free (devtype);
grub_free (aliasname);
return 0;
}