HID: multitouch: Correct devm device reference for hidinput input_dev name
authorRahul Rameshbabu <sergeantsagara@protonmail.com>
Thu, 24 Aug 2023 06:14:33 +0000 (06:14 +0000)
committerBenjamin Tissoires <bentiss@kernel.org>
Thu, 24 Aug 2023 13:57:57 +0000 (15:57 +0200)
Reference the HID device rather than the input device for the devm
allocation of the input_dev name. Referencing the input_dev would lead to a
use-after-free when the input_dev was unregistered and subsequently fires a
uevent that depends on the name. At the point of firing the uevent, the
name would be freed by devres management.

Use devm_kasprintf to simplify the logic for allocating memory and
formatting the input_dev name string.

Reported-by: Maxime Ripard <mripard@kernel.org>
Closes: https://lore.kernel.org/linux-input/ZOZIZCND+L0P1wJc@penguin/T/#m443f3dce92520f74b6cf6ffa8653f9c92643d4ae
Fixes: c08d46aa805b ("HID: multitouch: devm conversion")
Suggested-by: Maxime Ripard <mripard@kernel.org>
Suggested-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: Rahul Rameshbabu <sergeantsagara@protonmail.com>
Reviewed-by: Maxime Ripard <mripard@kernel.org>
Link: https://lore.kernel.org/r/20230824061308.222021-3-sergeantsagara@protonmail.com
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
drivers/hid/hid-multitouch.c

index e31be0c..521b2ff 100644 (file)
@@ -1594,7 +1594,6 @@ static void mt_post_parse(struct mt_device *td, struct mt_application *app)
 static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
 {
        struct mt_device *td = hid_get_drvdata(hdev);
-       char *name;
        const char *suffix = NULL;
        struct mt_report_data *rdata;
        struct mt_application *mt_application = NULL;
@@ -1645,15 +1644,9 @@ static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
                break;
        }
 
-       if (suffix) {
-               name = devm_kzalloc(&hi->input->dev,
-                                   strlen(hdev->name) + strlen(suffix) + 2,
-                                   GFP_KERNEL);
-               if (name) {
-                       sprintf(name, "%s %s", hdev->name, suffix);
-                       hi->input->name = name;
-               }
-       }
+       if (suffix)
+               hi->input->name = devm_kasprintf(&hdev->dev, GFP_KERNEL,
+                                                "%s %s", hdev->name, suffix);
 
        return 0;
 }