greybus: manifest: check for duplicate CPort descriptors when parsing
authorJohan Hovold <johan@hovoldconsulting.com>
Thu, 21 Jan 2016 16:34:10 +0000 (17:34 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Fri, 22 Jan 2016 06:45:09 +0000 (22:45 -0800)
Now that connection creation has been separated from interface
initialisation, we should explicitly check for duplicate CPort
descriptors when parsing the manifest.

Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/manifest.c

index 64c60c2dfaf5864ecb74c7c5883e35a6fefe6fe6..5ca36c9001beddcb3605b39ebd41771ac19dd1f9 100644 (file)
@@ -230,8 +230,7 @@ static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
 {
        struct gb_interface *intf = bundle->intf;
        struct greybus_descriptor_cport *desc_cport;
-       struct manifest_desc *desc;
-       struct manifest_desc *next;
+       struct manifest_desc *desc, *next, *tmp;
        LIST_HEAD(list);
        u8 bundle_id = bundle->id;
        u16 cport_id;
@@ -251,7 +250,19 @@ static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
                if (cport_id > CPORT_ID_MAX)
                        goto exit;
 
-               /* Found one, move it to our temporary list. */
+               /*
+                * Found one, move it to our temporary list after checking for
+                * duplicates.
+                */
+               list_for_each_entry(tmp, &list, links) {
+                       desc_cport = tmp->data;
+                       if (cport_id == desc_cport->id) {
+                               dev_err(&bundle->dev,
+                                               "duplicate CPort %u found\n",
+                                               cport_id);
+                               goto exit;
+                       }
+               }
                list_move(&desc->links, &list);
                count++;
        }