]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - lib/hashtable.c
Merge git://git.denx.de/u-boot-rockchip
[people/ms/u-boot.git] / lib / hashtable.c
index 18ed5901ec284b63150435bf5af9b8db6b42d373..f08847758a091da8d9960ff94ec830fbcfa502ce 100644 (file)
@@ -477,11 +477,11 @@ int hdelete_r(const char *key, struct hsearch_data *htab, int flag)
        return 1;
 }
 
+#if !(defined(CONFIG_SPL_BUILD) && !defined(CONFIG_SPL_SAVEENV))
 /*
  * hexport()
  */
 
-#ifndef CONFIG_SPL_BUILD
 /*
  * Export the data stored in the hash table in linearized form.
  *
@@ -499,7 +499,7 @@ int hdelete_r(const char *key, struct hsearch_data *htab, int flag)
  *
  * If the separator character is different from NUL, then any
  * separator characters and backslash characters in the values will
- * be escaped by a preceeding backslash in output. This is needed for
+ * be escaped by a preceding backslash in output. This is needed for
  * example to enable multi-line values, especially when the output
  * shall later be parsed (for example, for re-import).
  *
@@ -602,8 +602,8 @@ ssize_t hexport_r(struct hsearch_data *htab, const char sep, int flag,
                return (-1);
        }
 
-       debug("EXPORT  table = %p, htab.size = %d, htab.filled = %d, "
-               "size = %zu\n", htab, htab->size, htab->filled, size);
+       debug("EXPORT  table = %p, htab.size = %d, htab.filled = %d, size = %lu\n",
+             htab, htab->size, htab->filled, (ulong)size);
        /*
         * Pass 1:
         * search used entries,
@@ -657,8 +657,8 @@ ssize_t hexport_r(struct hsearch_data *htab, const char sep, int flag,
        /* Check if the user supplied buffer size is sufficient */
        if (size) {
                if (size < totlen + 1) {        /* provided buffer too small */
-                       printf("Env export buffer too small: %zu, "
-                               "but need %zu\n", size, totlen + 1);
+                       printf("Env export buffer too small: %lu, but need %lu\n",
+                              (ulong)size, (ulong)totlen + 1);
                        __set_errno(ENOMEM);
                        return (-1);
                }
@@ -789,12 +789,13 @@ int himport_r(struct hsearch_data *htab,
        }
 
        /* we allocate new space to make sure we can write to the array */
-       if ((data = malloc(size)) == NULL) {
-               debug("himport_r: can't malloc %zu bytes\n", size);
+       if ((data = malloc(size + 1)) == NULL) {
+               debug("himport_r: can't malloc %lu bytes\n", (ulong)size + 1);
                __set_errno(ENOMEM);
                return 0;
        }
        memcpy(data, env, size);
+       data[size] = '\0';
        dp = data;
 
        /* make a local copy of the list of variables */
@@ -821,7 +822,7 @@ int himport_r(struct hsearch_data *htab,
         * (CONFIG_ENV_SIZE).  This heuristics will result in
         * unreasonably large numbers (and thus memory footprint) for
         * big flash environments (>8,000 entries for 64 KB
-        * envrionment size), so we clip it to a reasonable value.
+        * environment size), so we clip it to a reasonable value.
         * On the other hand we need to add some more entries for free
         * space when importing very small buffers. Both boundaries can
         * be overwritten in the board config file if needed.
@@ -841,8 +842,10 @@ int himport_r(struct hsearch_data *htab,
                }
        }
 
-       if(!size)
+       if (!size) {
+               free(data);
                return 1;               /* everything OK */
+       }
        if(crlf_is_lf) {
                /* Remove Carriage Returns in front of Line Feeds */
                unsigned ignored_crs = 0;
@@ -906,6 +909,7 @@ int himport_r(struct hsearch_data *htab,
                if (*name == 0) {
                        debug("INSERT: unable to use an empty key\n");
                        __set_errno(EINVAL);
+                       free(data);
                        return 0;
                }