[libubootenv] uboot_env: Add parsing of .flag variable also when env is read from a default env file
diff mbox series

Message ID 2710c0a6-1ffb-4182-943e-33cb7fd41c50@googlegroups.com
State New
Headers show
Series
  • [libubootenv] uboot_env: Add parsing of .flag variable also when env is read from a default env file
Related show

Commit Message

Uwe Schuster Aug. 2, 2019, 11:36 a.m. UTC
This patch fixes the default env flag parsing issue reported in 
https://groups.google.com/d/msg/swupdate/ShdD10dl7Pc/ULUYSpFDCAAJ:

3. When reading the variables from the default env file (like after an 
> erased env flash area or with -f command line flag) and if the .flags 
> variable is part of the default env file, it is not parsed, as when read 
> from normal u-boot env 
>

---
 src/uboot_env.c | 150 +++++++++++++++++++++++++++---------------------
 1 file changed, 85 insertions(+), 65 deletions(-)

 
@@ -981,10 +989,22 @@ int libuboot_load_file(struct uboot_ctx *ctx, const 
char *filename)
 
         name = buf;
 
-        libuboot_set_env(ctx, name, value);
+            if (!strcmp(name, ".flags"))
+                flagsvar = strdup(value);
+        else
+                libuboot_set_env(ctx, name, value);
     }
-    fclose(fp);
+
+    /*
+     * Parse .flags and set the attributes for a variable
+     */
+    if (flagsvar) {
+        libuboot_parseflags(ctx, flagsvar);
+    }
+
+    free(flagsvar);
     free(buf);
+    fclose(fp);
 
     return 0;
 }

Patch
diff mbox series

diff --git a/src/uboot_env.c b/src/uboot_env.c
index 726c433..91f94e7 100644
--- a/src/uboot_env.c
+++ b/src/uboot_env.c
@@ -745,6 +745,73 @@  int libuboot_env_store(struct uboot_ctx *ctx)
     return ret;
 }
 
+static void libuboot_parseflags(struct uboot_ctx *ctx, char* flagsvar)
+{
+    char *pvar;
+    char *pval;
+    struct var_entry *entry;
+
+#if !defined(NDEBUG)
+    fprintf(stdout, "Environment FLAGS %s\n", flagsvar);
+#endif
+    pvar = flagsvar;
+
+    while (*pvar && (pvar - flagsvar) < strlen(flagsvar)) {
+        char *pnext;
+        pval = strchr(pvar, ':');
+        if (!pval)
+            break;
+
+        *pval++ = '\0';
+        pnext = strchr(pval, ',');
+        if (!pnext)
+            pnext = flagsvar + strlen(flagsvar);
+        else
+            *pnext++ = '\0';
+
+        entry = __libuboot_get_env(&ctx->varlist, pvar);
+        if (entry) {
+            for (int i = 0; i < strlen(pval); i++) {
+                switch (pval[i]) {
+                case 's':
+                    entry->type = TYPE_ATTR_STRING;
+                    break;
+                case 'd':
+                    entry->type = TYPE_ATTR_DECIMAL;
+                    break;
+                case 'x':
+                    entry->type = TYPE_ATTR_HEX;
+                    break;
+                case 'b':
+                    entry->type = TYPE_ATTR_BOOL;
+                    break;
+                case 'i':
+                    entry->type = TYPE_ATTR_IP;
+                    break;
+                case 'm':
+                    entry->type = TYPE_ATTR_MAC;
+                    break;
+                case 'a':
+                    entry->access = ACCESS_ATTR_ANY;
+                    break;
+                case 'r':
+                    entry->access = ACCESS_ATTR_READ_ONLY;
+                    break;
+                case 'o':
+                    entry->access = ACCESS_ATTR_WRITE_ONCE;
+                    break;
+                case 'c':
+                    entry->access = ACCESS_ATTR_CHANGE_DEFAULT;
+                    break;
+                default: /* ignore it */
+                    break;
+                }
+            }
+        }
+        pvar = pnext;
+    }
+}
+
 static int libuboot_load(struct uboot_ctx *ctx)
 {
     int ret, i;
@@ -871,72 +938,11 @@  static int libuboot_load(struct uboot_ctx *ctx)
     /*
      * Parse .flags and set the attributes for a variable
      */
-    char *pvar;
-    char *pval;
     if (flagsvar) {
-#if !defined(NDEBUG)
-    fprintf(stdout, "Environment FLAGS %s\n", flagsvar);
-#endif
-        pvar = flagsvar;
-
-        while (*pvar && (pvar - flagsvar) < strlen(flagsvar)) {
-            char *pnext;
-            pval = strchr(pvar, ':');
-            if (!pval)
-                break;
-
-            *pval++ = '\0';
-            pnext = strchr(pval, ',');
-            if (!pnext)
-                pnext = flagsvar + strlen(flagsvar);
-            else
-                *pnext++ = '\0';
-
-            entry = __libuboot_get_env(&ctx->varlist, pvar);
-            if (entry) {
-                for (int i = 0; i < strlen(pval); i++) {
-                    switch (pval[i]) {
-                    case 's':
-                        entry->type = TYPE_ATTR_STRING;
-                        break;
-                    case 'd':
-                        entry->type = TYPE_ATTR_DECIMAL;
-                        break;
-                    case 'x':
-                        entry->type = TYPE_ATTR_HEX;
-                        break;
-                    case 'b':
-                        entry->type = TYPE_ATTR_BOOL;
-                        break;
-                    case 'i':
-                        entry->type = TYPE_ATTR_IP;
-                        break;
-                    case 'm':
-                        entry->type = TYPE_ATTR_MAC;
-                        break;
-                    case 'a':
-                        entry->access = ACCESS_ATTR_ANY;
-                        break;
-                    case 'r':
-                        entry->access = ACCESS_ATTR_READ_ONLY;
-                        break;
-                    case 'o':
-                        entry->access = ACCESS_ATTR_WRITE_ONCE;
-                        break;
-                    case 'c':
-                        entry->access = ACCESS_ATTR_CHANGE_DEFAULT;
-                        break;
-                    default: /* ignore it */
-                        break;
-                    }
-                }
-            }
-
-            pvar = pnext;
-        }
+        libuboot_parseflags(ctx, flagsvar);
     }
-    free(flagsvar);
 
+    free(flagsvar);
     free(buf[0]);
 
     return ctx->valid ? 0 : -ENODATA;
@@ -963,6 +969,8 @@  int libuboot_load_file(struct uboot_ctx *ctx, const 
char *filename)
         return -ENOMEM;
     }
 
+    char *flagsvar = NULL;
+
     while (fgets(buf, LINE_LENGTH, fp)) {
         int len = strlen(buf);