imx: parse-container: Use malloc for container processing
authorNitin Garg <nitin.garg@nxp.com>
Thu, 15 Jun 2023 10:09:22 +0000 (18:09 +0800)
committerStefano Babic <sbabic@denx.de>
Thu, 13 Jul 2023 09:29:40 +0000 (11:29 +0200)
If the container has image which conflicts with
spl_get_load_buffer address, there are processing failures.
Use malloc instead of spl_get_load_buffer.

Reviewed-by: Ye Li <ye.li@nxp.com>
Signed-off-by: Nitin Garg <nitin.garg@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
arch/arm/mach-imx/parse-container.c

index a0d1eb3..c5b3abc 100644 (file)
@@ -4,6 +4,7 @@
  */
 
 #include <common.h>
+#include <stdlib.h>
 #include <errno.h>
 #include <log.h>
 #include <spl.h>
@@ -134,21 +135,27 @@ static int read_auth_container(struct spl_image_info *spl_image,
         * It will not override the ATF code, so safe to use it here,
         * no need malloc
         */
-       container = (struct container_hdr *)spl_get_load_buffer(-size, size);
+       container = malloc(size);
+       if (!container)
+               return -ENOMEM;
 
        debug("%s: container: %p sector: %lu sectors: %u\n", __func__,
              container, sector, sectors);
-       if (info->read(info, sector, sectors, container) != sectors)
-               return -EIO;
+       if (info->read(info, sector, sectors, container) != sectors) {
+               ret = -EIO;
+               goto end;
+       }
 
        if (container->tag != 0x87 && container->version != 0x0) {
-               printf("Wrong container header\n");
-               return -ENOENT;
+               printf("Wrong container header");
+               ret = -ENOENT;
+               goto end;
        }
 
        if (!container->num_images) {
-               printf("Wrong container, no image found\n");
-               return -ENOENT;
+               printf("Wrong container, no image found");
+               ret = -ENOENT;
+               goto end;
        }
 
        length = container->length_lsb + (container->length_msb << 8);
@@ -158,13 +165,18 @@ static int read_auth_container(struct spl_image_info *spl_image,
                size = roundup(length, info->bl_len);
                sectors = size / info->bl_len;
 
-               container = (struct container_hdr *)spl_get_load_buffer(-size, size);
+               free(container);
+               container = malloc(size);
+               if (!container)
+                       return -ENOMEM;
 
                debug("%s: container: %p sector: %lu sectors: %u\n",
                      __func__, container, sector, sectors);
                if (info->read(info, sector, sectors, container) !=
-                   sectors)
-                       return -EIO;
+                   sectors) {
+                       ret = -EIO;
+                       goto end;
+               }
        }
 
 #ifdef CONFIG_AHAB_BOOT
@@ -175,7 +187,7 @@ static int read_auth_container(struct spl_image_info *spl_image,
                                   SECO_LOCAL_SEC_SEC_SECURE_RAM_BASE);
        if (ret) {
                printf("authenticate container hdr failed, return %d\n", ret);
-               return ret;
+               goto end_auth;
        }
 #endif
 
@@ -200,6 +212,10 @@ end_auth:
        if (sc_seco_authenticate(-1, SC_SECO_REL_CONTAINER, 0))
                printf("Error: release container failed!\n");
 #endif
+
+end:
+       free(container);
+
        return ret;
 }