Commit 52e8ce31 authored by Alex Elder's avatar Alex Elder Committed by Greg Kroah-Hartman

greybus: manifest: clean up properly when parsing cports

Currently, if an error occurs creating a connection, we simply
return an error without cleaning up any of the connections that
had already been successfully set up.

Add code to destroy connections that have been created in the event
an error occurs.  Add a check to ensure the bundle's list of
connections was empty before parsing for CPorts begins.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent f9b0366f
......@@ -201,11 +201,16 @@ static char *gb_string_get(struct gb_interface *intf, u8 string_id)
static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
{
struct gb_interface *intf = bundle->intf;
struct gb_connection *connection;
struct gb_connection *connection_next;
struct manifest_desc *desc;
struct manifest_desc *next;
u8 bundle_id = bundle->id;
u32 count = 0;
if (WARN_ON(!list_empty(&bundle->connections)))
return 0;
/* Set up all cport descriptors associated with this bundle */
list_for_each_entry_safe(desc, next, &intf->manifest_descs, links) {
struct greybus_descriptor_cport *desc_cport;
......@@ -223,7 +228,7 @@ static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
protocol_id = desc_cport->protocol_id;
cport_id = le16_to_cpu(desc_cport->id);
if (!gb_connection_create(bundle, cport_id, protocol_id))
return 0; /* Error */
goto cleanup;
count++;
......@@ -232,6 +237,14 @@ static u32 gb_manifest_parse_cports(struct gb_bundle *bundle)
}
return count;
cleanup:
/* An error occurred; undo any changes we've made */
list_for_each_entry_safe(connection, connection_next,
&bundle->connections, bundle_links) {
gb_connection_destroy(connection);
count--;
}
return 0; /* Error; count should also be 0 */
}
/*
......
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