commit-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


From: David S. Miller
Subject: [2132] * include/grub/ieee1275/ieee1275.h (IEEE1275_MAX_PROP_LEN,
Date: Wed, 22 Apr 2009 09:46:55 +0000

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 <address@hidden>
 
        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;
 }
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]