[2132] * include/grub/ieee1275/ieee1275.h (IEEE1275_MAX_PROP_LEN,

"David S. Miller" <[email protected]>
Newsgroups gmane.comp.boot-loaders.grub.cvs
Message-ID <[email protected]>
Revision: 2132
          http://svn.sv.gnu.org/viewvc/?view=rev&root=grub&revision=2132
Author:   davem
Date:     2009-04-22 09:46:54 +0000 (Wed, 22 Apr 2009)
Log Message:
-----------
	* 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.

Modified Paths:
--------------
    trunk/grub2/ChangeLog
    trunk/grub2/include/grub/ieee1275/ieee1275.h
    trunk/grub2/kern/ieee1275/openfw.c

Modified: trunk/grub2/ChangeLog
===================================================================
--- trunk/grub2/ChangeLog	2009-04-22 09:45:43 UTC (rev 2131)
+++ trunk/grub2/ChangeLog	2009-04-22 09:46:54 UTC (rev 2132)
@@ -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 <[email protected]>
 
 	Correct GPT definition

Modified: trunk/grub2/include/grub/ieee1275/ieee1275.h
===================================================================
--- trunk/grub2/include/grub/ieee1275/ieee1275.h	2009-04-22 09:45:43 UTC (rev 2131)
+++ trunk/grub2/include/grub/ieee1275/ieee1275.h	2009-04-22 09:46:54 UTC (rev 2132)
@@ -39,6 +39,9 @@
   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

Modified: trunk/grub2/kern/ieee1275/openfw.c
===================================================================
--- trunk/grub2/kern/ieee1275/openfw.c	2009-04-22 09:45:43 UTC (rev 2131)
+++ trunk/grub2/kern/ieee1275/openfw.c	2009-04-22 09:46:54 UTC (rev 2132)
@@ -38,6 +38,8 @@
 {
   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 @@
   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 @@
     }
   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_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_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 @@
       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_dprintf ("devalias", "get_property (%s) failed\n", aliasname);
 	  goto nextprop;
 	}
+      devpath [actual] = '\0';
 
       if (grub_ieee1275_finddevice (devpath, &dev))
 	{
@@ -144,6 +188,8 @@
       grub_free (devpath);
     }
 
+  grub_free (devtype);
+  grub_free (aliasname);
   return 0;
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.