load_simple_fit() returns -EPERM for the images with broken signatures.
Unfortunately this may conflict with image loaging selection on the base
of boot phase. See commit 873112db9ce68c38984ff25808dde726f8dd5573
("spl: Support selecting images based on phase in simple FIT").

Thus loading of

        configurations {
                uboot {
                        description = "u-boot";
                        firmware = "atf";
                        loadables = "atf", "tee", "uboot";
                };
        };

with damaged "tee" image may finish without errors. This may results in
board bricking.

This patch fixes commit 873112db9ce68c38984ff25808dde726f8dd5573
("spl: Support selecting images based on phase in simple FIT")
by replacing EPERM with EBADSLT places where it should be done.

Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevets...@iopsys.eu>
---
 common/spl/spl_fit.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c
index ab277bb2baa..321954a1547 100644
--- a/common/spl/spl_fit.c
+++ b/common/spl/spl_fit.c
@@ -200,7 +200,7 @@ static int get_aligned_image_size(struct spl_load_info 
*info, int data_size,
  *             the image gets loaded to the address pointed to by the
  *             load_addr member in this struct, if load_addr is not 0
  *
- * Return:     0 on success, -EPERM if this image is not the correct phase
+ * Return:     0 on success, -EBADSLT if this image is not the correct phase
  * (for CONFIG_BOOTMETH_VBE_SIMPLE_FW), or another negative error number on
  * other error.
  */
@@ -236,7 +236,7 @@ static int load_simple_fit(struct spl_load_info *info, 
ulong fit_offset,
                        return ret;
                } else {
                        log_debug("- phase mismatch, skipping this image\n");
-                       return -EPERM;
+                       return -EBADSLT;
                }
        }
 
@@ -475,7 +475,7 @@ static int spl_fit_append_fdt(struct spl_image_info 
*spl_image,
                        image_info.load_addr = (ulong)tmpbuffer;
                        ret = load_simple_fit(info, offset, ctx, node,
                                              &image_info);
-                       if (ret == -EPERM)
+                       if (ret == -EBADSLT)
                                continue;
                        else if (ret < 0)
                                break;
@@ -835,7 +835,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
 
                image_info.load_addr = 0;
                ret = load_simple_fit(info, offset, &ctx, node, &image_info);
-               if (ret < 0 && ret != -EPERM) {
+               if (ret < 0 && ret != -EBADSLT) {
                        printf("%s: can't load image loadables index %d (ret = 
%d)\n",
                               __func__, index, ret);
                        return ret;
-- 
2.47.2

Reply via email to