usb: gadget: f_hid: fix error handling in ghid_setup()
Subsystems (2)
PATCH 2/2 usb: gadget: f_hid: fix error handling in ghid_setup()
There were a two issues here.
1) We returned PTR_ERR(NULL) which means success if class_create() failed.
2) If alloc_chrdev_region() failed then we should clean up before returning.
Also kernel style is to have "error handling" as opposed to "success handling". In the original code checking for "if (!status) " is confusing and this bad style is what lead to bug #2.
Signed-off-by Dan Carpenter <[email protected]>
drivers/usb/gadget/function/f_hid.c +10 -5
@@ -972,17 +972,22 @@ int ghid_setup(struct usb_gadget *g, int count) hidg_class =class_create (THIS_MODULE ,"hidg" );if (IS_ERR (hidg_class)) { + status =PTR_ERR (hidg_class); hidg_class =NULL ; -return PTR_ERR (hidg_class); +return status; } status =alloc_chrdev_region (&dev,0 , count,"hidg" ); -if (!status) { - major =MAJOR (dev); - minors = count; +if (status) { +class_destroy (hidg_class); + hidg_class =NULL ; +return status; } -return status; + major =MAJOR (dev); + minors = count; + +return 0 ; }void ghid_cleanup (void )