greybus: manifest: check for duplicate CPort descriptors when parsing

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>
This commit is contained in:
Johan Hovold 2016-01-21 17:34:10 +01:00 committed by Greg Kroah-Hartman
parent 98fdf5a037
commit d6fba3dbb0

View File

@ -230,8 +230,7 @@ static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
{ {
struct gb_interface *intf = bundle->intf; struct gb_interface *intf = bundle->intf;
struct greybus_descriptor_cport *desc_cport; struct greybus_descriptor_cport *desc_cport;
struct manifest_desc *desc; struct manifest_desc *desc, *next, *tmp;
struct manifest_desc *next;
LIST_HEAD(list); LIST_HEAD(list);
u8 bundle_id = bundle->id; u8 bundle_id = bundle->id;
u16 cport_id; u16 cport_id;
@ -251,7 +250,19 @@ static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
if (cport_id > CPORT_ID_MAX) if (cport_id > CPORT_ID_MAX)
goto exit; 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); list_move(&desc->links, &list);
count++; count++;
} }