diff options
author | Johan Hovold <johan@hovoldconsulting.com> | 2016-04-13 19:18:55 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@google.com> | 2016-04-21 10:03:13 +0900 |
commit | 7d963cbe8302d16d2171ecc729782f0d2e7cfbe7 (patch) | |
tree | bb950248555ed2bfae2fecf99288a534d557e161 /drivers/staging/greybus/manifest.c | |
parent | d1d67714a4ece3c1438c9d7def324ee0424e7cbd (diff) | |
download | op-kernel-dev-7d963cbe8302d16d2171ecc729782f0d2e7cfbe7.zip op-kernel-dev-7d963cbe8302d16d2171ecc729782f0d2e7cfbe7.tar.gz |
greybus: manifest: fix illegal free in error path
The manifest-parsing code could end up leaving the interface
vendor_string set to an error pointer that we'd eventually try to free
when destroying the interface.
Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/manifest.c')
-rw-r--r-- | drivers/staging/greybus/manifest.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/staging/greybus/manifest.c b/drivers/staging/greybus/manifest.c index 070afc6..cca4592 100644 --- a/drivers/staging/greybus/manifest.c +++ b/drivers/staging/greybus/manifest.c @@ -384,15 +384,18 @@ static bool gb_manifest_parse_interface(struct gb_interface *intf, struct manifest_desc *interface_desc) { struct greybus_descriptor_interface *desc_intf = interface_desc->data; + char *str; /* Handle the strings first--they can fail */ - intf->vendor_string = gb_string_get(intf, desc_intf->vendor_stringid); - if (IS_ERR(intf->vendor_string)) + str = gb_string_get(intf, desc_intf->vendor_stringid); + if (IS_ERR(str)) return false; + intf->vendor_string = str; - intf->product_string = gb_string_get(intf, desc_intf->product_stringid); - if (IS_ERR(intf->product_string)) + str = gb_string_get(intf, desc_intf->product_stringid); + if (IS_ERR(str)) goto out_free_vendor_string; + intf->product_string = str; /* Release the interface descriptor, now that we're done with it */ release_manifest_descriptor(interface_desc); |