mkimage: Automatically expand FDT in more cases
authorSimon Glass <sjg@chromium.org>
Thu, 12 Jun 2014 13:24:42 +0000 (07:24 -0600)
committerTom Rini <trini@ti.com>
Thu, 19 Jun 2014 15:18:56 +0000 (11:18 -0400)
The original code did not cover every case and there was a missing negative
sign in one case. Expand the coverage and fix the bug.

Signed-off-by: Simon Glass <sjg@chromium.org>
lib/rsa/rsa-sign.c
tools/image-host.c

index 48f3197209686156c325226d94866556886f3fee..83f5e87838950a7fb63f2de0aac6891cf40e2abd 100644 (file)
@@ -405,11 +405,15 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest)
        if (parent == -FDT_ERR_NOTFOUND) {
                parent = fdt_add_subnode(keydest, 0, FIT_SIG_NODENAME);
                if (parent < 0) {
-                       fprintf(stderr, "Couldn't create signature node: %s\n",
-                               fdt_strerror(parent));
-                       return -EINVAL;
+                       ret = parent;
+                       if (ret != -FDT_ERR_NOSPACE) {
+                               fprintf(stderr, "Couldn't create signature node: %s\n",
+                                       fdt_strerror(parent));
+                       }
                }
        }
+       if (ret)
+               goto done;
 
        /* Either create or overwrite the named key node */
        snprintf(name, sizeof(name), "key-%s", info->keyname);
@@ -417,18 +421,22 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest)
        if (node == -FDT_ERR_NOTFOUND) {
                node = fdt_add_subnode(keydest, parent, name);
                if (node < 0) {
-                       fprintf(stderr, "Could not create key subnode: %s\n",
-                               fdt_strerror(node));
-                       return -EINVAL;
+                       ret = node;
+                       if (ret != -FDT_ERR_NOSPACE) {
+                               fprintf(stderr, "Could not create key subnode: %s\n",
+                                       fdt_strerror(node));
+                       }
                }
        } else if (node < 0) {
                fprintf(stderr, "Cannot select keys parent: %s\n",
                        fdt_strerror(node));
-               return -ENOSPC;
+               ret = node;
        }
 
-       ret = fdt_setprop_string(keydest, node, "key-name-hint",
+       if (!ret) {
+               ret = fdt_setprop_string(keydest, node, "key-name-hint",
                                 info->keyname);
+       }
        if (!ret)
                ret = fdt_setprop_u32(keydest, node, "rsa,num-bits", bits);
        if (!ret)
@@ -449,10 +457,11 @@ int rsa_add_verify_data(struct image_sign_info *info, void *keydest)
                ret = fdt_setprop_string(keydest, node, "required",
                                         info->require_keys);
        }
+done:
        BN_free(modulus);
        BN_free(r_squared);
        if (ret)
-               return ret == FDT_ERR_NOSPACE ? -ENOSPC : -EIO;
+               return ret == -FDT_ERR_NOSPACE ? -ENOSPC : -EIO;
 
        return 0;
 }
index 2be5e8043c1dd9cefa7b0380dd51533bee473fea..faeef66efc43dbe9b847b959a1f67a7cb937964f 100644 (file)
@@ -609,11 +609,13 @@ static int fit_config_process_sig(const char *keydir, void *keydest,
        /* Write the public key into the supplied FDT file */
        if (keydest) {
                ret = info.algo->add_verify_data(&info, keydest);
+               if (ret == -ENOSPC)
+                       return -ENOSPC;
                if (ret) {
                        printf("Failed to add verification data for '%s' signature node in '%s' image node\n",
                               node_name, conf_name);
-                       return ret == FDT_ERR_NOSPACE ? -ENOSPC : -EIO;
                }
+               return ret;
        }
 
        return 0;