gadget: rockchip: Add rk3128 USB_GADGET_PRODUCT_NUM
[oweals/u-boot.git] / lib / efi_loader / efi_device_path.c
index 897fc1b2e8ac38f57819ab8157da4b968ea7428e..17a0c5bb450cc6aef769c5866b722aaf9d389533 100644 (file)
@@ -15,6 +15,7 @@
 #include <part.h>
 #include <sandboxblockdev.h>
 #include <asm-generic/unaligned.h>
+#include <linux/compat.h> /* U16_MAX */
 
 #ifdef CONFIG_SANDBOX
 const efi_guid_t efi_guid_host_dev = U_BOOT_HOST_DEV_GUID;
@@ -888,13 +889,16 @@ struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
 {
        struct efi_device_path_file_path *fp;
        void *buf, *start;
-       unsigned dpsize = 0, fpsize;
+       size_t dpsize = 0, fpsize;
 
        if (desc)
                dpsize = dp_part_size(desc, part);
 
        fpsize = sizeof(struct efi_device_path) +
                 2 * (utf8_utf16_strlen(path) + 1);
+       if (fpsize > U16_MAX)
+               return NULL;
+
        dpsize += fpsize;
 
        start = buf = dp_alloc(dpsize + sizeof(END));
@@ -908,7 +912,7 @@ struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
        fp = buf;
        fp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
        fp->dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH;
-       fp->dp.length = fpsize;
+       fp->dp.length = (u16)fpsize;
        path_to_uefi(fp->str, path);
        buf += fpsize;
 
@@ -1028,6 +1032,16 @@ out:
        return EFI_SUCCESS;
 }
 
+/**
+ * efi_dp_from_name() - convert U-Boot device and file path to device path
+ *
+ * @dev:       U-Boot device, e.g. 'mmc'
+ * @devnr:     U-Boot device number, e.g. 1 for 'mmc:1'
+ * @path:      file path relative to U-Boot device, may be NULL
+ * @device:    pointer to receive device path of the device
+ * @file:      pointer to receive device path for the file
+ * Return:     status code
+ */
 efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
                              const char *path,
                              struct efi_device_path **device,
@@ -1067,8 +1081,10 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
        s = filename;
        while ((s = strchr(s, '/')))
                *s++ = '\\';
-       *file = efi_dp_from_file(((!is_net && device) ? desc : NULL),
-                                part, filename);
+       *file = efi_dp_from_file(is_net ? NULL : desc, part, filename);
+
+       if (!*file)
+               return EFI_INVALID_PARAMETER;
 
        return EFI_SUCCESS;
 }