greybus: fix manifest parsing problem with descriptor payload
authorMatt Porter <mporter@linaro.org>
Mon, 6 Oct 2014 13:58:44 +0000 (09:58 -0400)
committerGreg Kroah-Hartman <greg@kroah.com>
Mon, 6 Oct 2014 15:57:15 +0000 (08:57 -0700)
The internal struct manifest_desc needs the data payload, rather
than the entire descriptor with header to be populated into the
data field. Also fix two places where the parser was trying to
extract the entire descriptor with header for the data payload
field.

Signed-off-by: Matt Porter <mporter@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/manifest.c

index f0468d768fe721ab914052ce9500add7f74740da..43ece7403c775c16099b8c1c8d95349e764fe7c9 100644 (file)
@@ -113,7 +113,7 @@ static int identify_descriptor(struct greybus_descriptor *desc, size_t size)
                return -ENOMEM;
 
        descriptor->size = desc_size;
-       descriptor->data = desc;
+       descriptor->data = (u8 *)desc + sizeof(*desc_header);
        descriptor->type = desc_header->type;
        list_add_tail(&descriptor->links, &manifest_descs);
 
@@ -143,13 +143,11 @@ static char *gb_string_get(u8 string_id)
                return NULL;
 
        list_for_each_entry(descriptor, &manifest_descs, links) {
-               struct greybus_descriptor *desc;
 
                if (descriptor->type != GREYBUS_TYPE_STRING)
                        continue;
 
-               desc = descriptor->data;
-               desc_string = &desc->string;
+               desc_string = descriptor->data;
                if (desc_string->id == string_id) {
                        found = true;
                        break;
@@ -262,8 +260,7 @@ static u32 gb_manifest_parse_interfaces(struct gb_module *gmod)
 static bool gb_manifest_parse_module(struct gb_module *gmod,
                                        struct manifest_desc *module_desc)
 {
-       struct greybus_descriptor *desc = module_desc->data;
-       struct greybus_descriptor_module *desc_module = &desc->module;
+       struct greybus_descriptor_module *desc_module = module_desc->data;
 
        /* Handle the strings first--they can fail */
        gmod->vendor_string = gb_string_get(desc_module->vendor_stringid);