diff mbox series

[3/3] HID: wacom: Fix double free on managed resource

Message ID 20220422161709.30198-3-jose.exposito89@gmail.com (mailing list archive)
State New, archived
Delegated to: Jiri Kosina
Headers show
Series [1/3] Input: goodix - Fix double free on managed resource | expand

Commit Message

José Expósito April 22, 2022, 4:17 p.m. UTC
As described in the documentation for devm_input_allocate_device():

  Managed input devices do not need to be explicitly unregistered or
  freed as it will be done automatically when owner device unbinds from
  its driver (or binding fails).

However this driver was explicitly freeing the input device, allocated
using devm_input_allocate_device() through wacom_allocate_input().

Remove the calls to input_free_device() to avoid a possible double free
error.

Fixes: d2d13f18aaa51 ("Input: wacom - create a separate input device for pads")
Signed-off-by: José Expósito <jose.exposito89@gmail.com>
---
 drivers/hid/wacom_sys.c | 3 ---
 1 file changed, 3 deletions(-)

Comments

Hans de Goede April 23, 2022, 11:42 a.m. UTC | #1
Hi,

On 4/22/22 18:17, José Expósito wrote:
> As described in the documentation for devm_input_allocate_device():
> 
>   Managed input devices do not need to be explicitly unregistered or
>   freed as it will be done automatically when owner device unbinds from
>   its driver (or binding fails).
> 
> However this driver was explicitly freeing the input device, allocated
> using devm_input_allocate_device() through wacom_allocate_input().
> 
> Remove the calls to input_free_device() to avoid a possible double free
> error.

Actually calling input_free_device() on a devm allocated input device
is fine. The input subsystem has chosen to not have a
separate devm_input_free_device(), instead input_free_device() knows
if a device is allocated through devm and then also frees the devres
tied to it:

void input_free_device(struct input_dev *dev)
{
        if (dev) {
                if (dev->devres_managed)
                        WARN_ON(devres_destroy(dev->dev.parent,
                                                devm_input_device_release,
                                                devm_input_device_match,
                                                dev));
                input_put_device(dev);
        }
}

So there is no need for this patch.

Regards,

Hans




> 
> Fixes: d2d13f18aaa51 ("Input: wacom - create a separate input device for pads")
> Signed-off-by: José Expósito <jose.exposito89@gmail.com>
> ---
>  drivers/hid/wacom_sys.c | 3 ---
>  1 file changed, 3 deletions(-)
> 
> diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
> index 066c567dbaa2..164c0f7cb796 100644
> --- a/drivers/hid/wacom_sys.c
> +++ b/drivers/hid/wacom_sys.c
> @@ -2098,7 +2098,6 @@ static int wacom_register_inputs(struct wacom *wacom)
>  	error = wacom_setup_pen_input_capabilities(pen_input_dev, wacom_wac);
>  	if (error) {
>  		/* no pen in use on this interface */
> -		input_free_device(pen_input_dev);
>  		wacom_wac->pen_input = NULL;
>  		pen_input_dev = NULL;
>  	} else {
> @@ -2110,7 +2109,6 @@ static int wacom_register_inputs(struct wacom *wacom)
>  	error = wacom_setup_touch_input_capabilities(touch_input_dev, wacom_wac);
>  	if (error) {
>  		/* no touch in use on this interface */
> -		input_free_device(touch_input_dev);
>  		wacom_wac->touch_input = NULL;
>  		touch_input_dev = NULL;
>  	} else {
> @@ -2122,7 +2120,6 @@ static int wacom_register_inputs(struct wacom *wacom)
>  	error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac);
>  	if (error) {
>  		/* no pad in use on this interface */
> -		input_free_device(pad_input_dev);
>  		wacom_wac->pad_input = NULL;
>  		pad_input_dev = NULL;
>  	} else {
diff mbox series

Patch

diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index 066c567dbaa2..164c0f7cb796 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -2098,7 +2098,6 @@  static int wacom_register_inputs(struct wacom *wacom)
 	error = wacom_setup_pen_input_capabilities(pen_input_dev, wacom_wac);
 	if (error) {
 		/* no pen in use on this interface */
-		input_free_device(pen_input_dev);
 		wacom_wac->pen_input = NULL;
 		pen_input_dev = NULL;
 	} else {
@@ -2110,7 +2109,6 @@  static int wacom_register_inputs(struct wacom *wacom)
 	error = wacom_setup_touch_input_capabilities(touch_input_dev, wacom_wac);
 	if (error) {
 		/* no touch in use on this interface */
-		input_free_device(touch_input_dev);
 		wacom_wac->touch_input = NULL;
 		touch_input_dev = NULL;
 	} else {
@@ -2122,7 +2120,6 @@  static int wacom_register_inputs(struct wacom *wacom)
 	error = wacom_setup_pad_input_capabilities(pad_input_dev, wacom_wac);
 	if (error) {
 		/* no pad in use on this interface */
-		input_free_device(pad_input_dev);
 		wacom_wac->pad_input = NULL;
 		pad_input_dev = NULL;
 	} else {