On Jul 16 2014 or thereabouts, Andrew Duggan wrote:
> It is possible that the hid-rmi driver could get loaded onto a device which 
> does not have the
> expected report ids. This should not happen because it would indicate that 
> the hid-rmi driver is
> not compatible with that device. However, if it does happen it should return 
> an error from probe
> instead of dereferencing a null pointer.
> 
> related bug:
> https://bugzilla.kernel.org/show_bug.cgi?id=80091
> 
> Signed-off-by: Andrew Duggan <[email protected]>
> ---

Hi Andrew,

I think this patch is required. We can not afford having a null pointer
in a driver. So yes, I think Jiri should take this one. I just have a
few nitpick inlined in the code.

However, this patch will prevent the driver to fail, but the falsely
bound device will not be driven by anybody, which means that you will
break the keyboard/touchpad/whatever which is not using the right
driver.

So yes, we need that, but we also defintively have to fix hid-core too
to not bind them to hid-rmi.

>  drivers/hid/hid-rmi.c | 26 ++++++++++++++++++++------
>  1 file changed, 20 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c
> index 3221a95..7f0927a 100644
> --- a/drivers/hid/hid-rmi.c
> +++ b/drivers/hid/hid-rmi.c
> @@ -848,6 +848,8 @@ static int rmi_probe(struct hid_device *hdev, const 
> struct hid_device_id *id)
>       struct rmi_data *data = NULL;
>       int ret;
>       size_t alloc_size;
> +     struct hid_report *input_report;
> +     struct hid_report *output_report;
>  
>       data = devm_kzalloc(&hdev->dev, sizeof(struct rmi_data), GFP_KERNEL);
>       if (!data)
> @@ -866,12 +868,24 @@ static int rmi_probe(struct hid_device *hdev, const 
> struct hid_device_id *id)
>               return ret;
>       }
>  
> -     data->input_report_size = (hdev->report_enum[HID_INPUT_REPORT]
> -             .report_id_hash[RMI_ATTN_REPORT_ID]->size >> 3)
> -             + 1 /* report id */;
> -     data->output_report_size = (hdev->report_enum[HID_OUTPUT_REPORT]
> -             .report_id_hash[RMI_WRITE_REPORT_ID]->size >> 3)
> -             + 1 /* report id */;
> +     input_report = hdev->report_enum[HID_INPUT_REPORT]
> +                     .report_id_hash[RMI_ATTN_REPORT_ID];
> +     if (!input_report) {
> +             ret = -ENODEV;
> +             return ret;

In its current state, the driver will be silently unbound, and the user
will never get any explanations on why nothing works. So please add an
hid_err message telling why hid-rmi gave up.

> +     }
> +
> +     data->input_report_size = (input_report->size >> 3) + 1 /* report id */;
> +
> +     output_report = hdev->report_enum[HID_OUTPUT_REPORT]
> +                     .report_id_hash[RMI_WRITE_REPORT_ID];
> +     if (!output_report) {
> +             ret = -ENODEV;
> +             return ret;

ditto.

Cheers,
Benjamin

> +     }
> +
> +     data->output_report_size = (output_report->size >> 3)
> +                                     + 1 /* report id */;
>  
>       alloc_size = data->output_report_size + data->input_report_size;
>  
> -- 
> 1.9.1
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to