On Sun, Jan 26, 2014 at 05:21:34PM +0100, Christian Engelmayer wrote:
> Fix a memory leak in the usb_store_new_id() error paths. When bailing out
> due to sanity checks, the function left the already allocated usb_dynid
> struct in place. This regression was introduced by the following commits:
> 
> c63fe8f6 (usb: core: add sanity checks when using bInterfaceClass with new_id)
> 1b9fb31f (usb: core: check for valid id_table when using the RefId feature)
> 52a6966c (usb: core: bail out if user gives an unknown RefId when using 
> new_id)
> 
> Detected by Coverity: CID 1162604.
> 
> Signed-off-by: Christian Engelmayer <cenge...@gmx.at>
> ---
> v2: Added changes suggested by Sergei Shtylyov:
> 
>     * Fix coding style violation regarding usage of braces in if-statements
>       if only one branch of a conditional statement is a single statement.
>     * Keep the information on commits introducing the issue in the changelog.
> ---
>  drivers/usb/core/driver.c | 14 ++++++++++----
>  1 file changed, 10 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
> index 5d01558..8fac6c6 100644
> --- a/drivers/usb/core/driver.c
> +++ b/drivers/usb/core/driver.c
> @@ -63,8 +63,10 @@ ssize_t usb_store_new_id(struct usb_dynids *dynids,
>       dynid->id.idProduct = idProduct;
>       dynid->id.match_flags = USB_DEVICE_ID_MATCH_DEVICE;
>       if (fields > 2 && bInterfaceClass) {
> -             if (bInterfaceClass > 255)
> +             if (bInterfaceClass > 255) {
> +                     kfree(dynid);
>                       return -EINVAL;
> +             }

I'd prefer a

        retval = -Esomething;
        goto error;

approach for the errors. I probably found another case to handle which
would benefit from the additional exit path as well.

Thanks for picking this issue up.

Attachment: signature.asc
Description: Digital signature

Reply via email to