Commit 19b3b2c2 authored by Viresh Kumar's avatar Viresh Kumar Committed by Greg Kroah-Hartman

greybus: manifest: descriptor size should be >= header size

We are calculating descriptors expected size differently based on the type of
descriptor, that's fine but at few places we aren't taking size of the header
into account. And that looks wrong.

Lets make sure it is atleast as big as descriptor's header.
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Signed-off-by: default avatarGreg Kroah-Hartman <greg@kroah.com>
parent 59e33444
...@@ -13,6 +13,27 @@ ...@@ -13,6 +13,27 @@
#include "greybus.h" #include "greybus.h"
static const char *get_descriptor_type_string(u8 type)
{
switch(type) {
case GREYBUS_TYPE_INVALID:
return "invalid";
case GREYBUS_TYPE_MODULE:
return "module";
case GREYBUS_TYPE_STRING:
return "string";
case GREYBUS_TYPE_INTERFACE:
return "interface";
case GREYBUS_TYPE_CPORT:
return "cport";
case GREYBUS_TYPE_CLASS:
return "class";
default:
WARN_ON(1);
return "unknown";
}
}
/* /*
* We scan the manifest once to identify where all the descriptors * We scan the manifest once to identify where all the descriptors
* are. The result is a list of these manifest_desc structures. We * are. The result is a list of these manifest_desc structures. We
...@@ -72,32 +93,21 @@ static int identify_descriptor(struct gb_interface *intf, ...@@ -72,32 +93,21 @@ static int identify_descriptor(struct gb_interface *intf,
return -EINVAL; return -EINVAL;
} }
/* Descriptor needs to at least have a header */
expected_size = sizeof(*desc_header);
switch (desc_header->type) { switch (desc_header->type) {
case GREYBUS_TYPE_MODULE: case GREYBUS_TYPE_MODULE:
if (desc_size < sizeof(struct greybus_descriptor_module)) { expected_size += sizeof(struct greybus_descriptor_module);
pr_err("module descriptor too small (%u)\n",
desc_size);
return -EINVAL;
}
break; break;
case GREYBUS_TYPE_STRING: case GREYBUS_TYPE_STRING:
expected_size = sizeof(*desc_header);
expected_size += sizeof(struct greybus_descriptor_string); expected_size += sizeof(struct greybus_descriptor_string);
expected_size += (size_t)desc->string.length; expected_size += desc->string.length;
if (desc_size < expected_size) {
pr_err("string descriptor too small (%u)\n",
desc_size);
return -EINVAL;
}
break; break;
case GREYBUS_TYPE_INTERFACE: case GREYBUS_TYPE_INTERFACE:
break; break;
case GREYBUS_TYPE_CPORT: case GREYBUS_TYPE_CPORT:
if (desc_size < sizeof(struct greybus_descriptor_cport)) { expected_size += sizeof(struct greybus_descriptor_cport);
pr_err("cport descriptor too small (%u)\n",
desc_size);
return -EINVAL;
}
break; break;
case GREYBUS_TYPE_CLASS: case GREYBUS_TYPE_CLASS:
pr_warn("class descriptor found (ignoring)\n"); pr_warn("class descriptor found (ignoring)\n");
...@@ -108,6 +118,13 @@ static int identify_descriptor(struct gb_interface *intf, ...@@ -108,6 +118,13 @@ static int identify_descriptor(struct gb_interface *intf,
return -EINVAL; return -EINVAL;
} }
if (desc_size < expected_size) {
pr_err("%s descriptor too small (%u < %zu)\n",
get_descriptor_type_string(desc_header->type),
desc_size, expected_size);
return -EINVAL;
}
descriptor = kzalloc(sizeof(*descriptor), GFP_KERNEL); descriptor = kzalloc(sizeof(*descriptor), GFP_KERNEL);
if (!descriptor) if (!descriptor)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment