grub-devel
[Top][All Lists]
Advanced

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

[PATCH v2 2/3] grub: Make grub_envblk_iterate() return an int


From: Prarit Bhargava
Subject: [PATCH v2 2/3] grub: Make grub_envblk_iterate() return an int
Date: Wed, 16 Jan 2019 13:34:42 -0500

grub_envblk_iterate() is a void.  Future functions will require the
ability to interpret return codes from the iteration, so
grub_envblk_iterate() should be an int.

The value of 0 returned from the hook functions is overloaded and cannot
be parsed by callers to grub_envblk_iterate() for error handling.  To fix
this add GRUB_ERR_ITERATE_STOP and GRUB_ERR_ITERATE_CONTINUE to the error
returns so the iteration can be stopped and continued respectively.

Make grub_envblk_iterate() return an int.

Signed-off-by: Prarit Bhargava <address@hidden>
Cc: address@hidden
Cc: address@hidden
Cc: address@hidden
Cc: address@hidden
Cc: Daniel Kiper <address@hidden>
---
 grub-core/commands/loadenv.c |  6 +++---
 grub-core/lib/envblk.c       | 17 ++++++++---------
 include/grub/err.h           |  4 +++-
 include/grub/lib/envblk.h    |  6 +++---
 util/grub-editenv.c          |  2 +-
 5 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/grub-core/commands/loadenv.c b/grub-core/commands/loadenv.c
index 3fd664aac331..1bbae5f7f332 100644
--- a/grub-core/commands/loadenv.c
+++ b/grub-core/commands/loadenv.c
@@ -144,14 +144,14 @@ set_var (const char *name, const char *value, void 
*whitelist)
   if (! whitelist)
     {
       grub_env_set (name, value);
-      return 0;
+      return GRUB_ERR_ITERATE_CONTINUE;
     }
 
   if (test_whitelist_membership (name,
                                 (const grub_env_whitelist_t *) whitelist))
     grub_env_set (name, value);
 
-  return 0;
+  return GRUB_ERR_ITERATE_CONTINUE;
 }
 
 static grub_err_t
@@ -192,7 +192,7 @@ print_var (const char *name, const char *value,
            void *hook_data __attribute__ ((unused)))
 {
   grub_printf ("%s=%s\n", name, value);
-  return 0;
+  return GRUB_ERR_ITERATE_CONTINUE;
 }
 
 static grub_err_t
diff --git a/grub-core/lib/envblk.c b/grub-core/lib/envblk.c
index 230e0e9d9abe..3e43843c4535 100644
--- a/grub-core/lib/envblk.c
+++ b/grub-core/lib/envblk.c
@@ -223,7 +223,7 @@ grub_envblk_delete (grub_envblk_t envblk, const char *name)
     }
 }
 
-void
+int
 grub_envblk_iterate (grub_envblk_t envblk,
                      void *hook_data,
                      int hook (const char *name, const char *value, void 
*hook_data))
@@ -247,8 +247,7 @@ grub_envblk_iterate (grub_envblk_t envblk,
           while (p < pend && *p != '=')
             p++;
           if (p == pend)
-            /* Broken.  */
-            return;
+            return GRUB_ERR_OUT_OF_RANGE;
           name_end = p;
 
           p++;
@@ -264,13 +263,11 @@ grub_envblk_iterate (grub_envblk_t envblk,
             }
 
           if (p >= pend)
-            /* Broken.  */
-            return;
+            return GRUB_ERR_OUT_OF_RANGE;
 
           name = grub_malloc (p - name_start + 1);
           if (! name)
-            /* out of memory.  */
-            return;
+            return GRUB_ERR_OUT_OF_MEMORY;
 
           value = name + (value_start - name_start);
 
@@ -288,10 +285,12 @@ grub_envblk_iterate (grub_envblk_t envblk,
 
           ret = hook (name, value, hook_data);
           grub_free (name);
-          if (ret)
-            return;
+          if (ret != GRUB_ERR_ITERATE_CONTINUE)
+            return ret;
         }
 
       p = find_next_line (p, pend);
     }
+
+    return GRUB_ERR_NONE;
 }
diff --git a/include/grub/err.h b/include/grub/err.h
index 1590c688e1d3..75ebb54201e8 100644
--- a/include/grub/err.h
+++ b/include/grub/err.h
@@ -71,7 +71,9 @@ typedef enum
     GRUB_ERR_NET_PACKET_TOO_BIG,
     GRUB_ERR_NET_NO_DOMAIN,
     GRUB_ERR_EOF,
-    GRUB_ERR_BAD_SIGNATURE
+    GRUB_ERR_BAD_SIGNATURE,
+    GRUB_ERR_ITERATE_STOP,
+    GRUB_ERR_ITERATE_CONTINUE
   }
 grub_err_t;
 
diff --git a/include/grub/lib/envblk.h b/include/grub/lib/envblk.h
index c3e655921709..7637791f4228 100644
--- a/include/grub/lib/envblk.h
+++ b/include/grub/lib/envblk.h
@@ -34,9 +34,9 @@ typedef struct grub_envblk *grub_envblk_t;
 grub_envblk_t grub_envblk_open (char *buf, grub_size_t size);
 int grub_envblk_set (grub_envblk_t envblk, const char *name, const char 
*value);
 void grub_envblk_delete (grub_envblk_t envblk, const char *name);
-void grub_envblk_iterate (grub_envblk_t envblk,
-                          void *hook_data,
-                          int hook (const char *name, const char *value, void 
*hook_data));
+int grub_envblk_iterate (grub_envblk_t envblk,
+                         void *hook_data,
+                         int hook (const char *name, const char *value, void 
*hook_data));
 void grub_envblk_close (grub_envblk_t envblk);
 
 static inline char *
diff --git a/util/grub-editenv.c b/util/grub-editenv.c
index 0b6c69b9688c..5f87b09d924a 100644
--- a/util/grub-editenv.c
+++ b/util/grub-editenv.c
@@ -169,7 +169,7 @@ print_var (const char *varname, const char *value,
            void *hook_data __attribute__ ((unused)))
 {
   printf ("%s=%s\n", varname, value);
-  return 0;
+  return GRUB_ERR_ITERATE_CONTINUE;
 }
 
 static void
-- 
2.17.2




reply via email to

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