Commit dde58cfc authored by David Herrmann's avatar David Herrmann Committed by Jiri Kosina

HID: wacom: Fix error path of power-supply initialization

power_supply_unregister() must not be called if power_supply_register() failed.
The wdata->psy.dev pointer may point to invalid memory after a failed
power_supply_register() and hence wacom_remove() will fail while calling
power_supply_unregister().

This changes the wacom_probe function to fail if it cannot register the
power_supply devices. If we would want to keep the previous behaviour we had to
keep some flag about the power_supply state and check it on wacom_remove, but
this seems inappropriate here. Hence, we simply fail, too, if
power_supply_register fails.
Signed-off-by: default avatarDavid Herrmann <dh.herrmann@googlemail.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 6d1db077
...@@ -353,11 +353,7 @@ static int wacom_probe(struct hid_device *hdev, ...@@ -353,11 +353,7 @@ static int wacom_probe(struct hid_device *hdev,
if (ret) { if (ret) {
hid_warn(hdev, "can't create sysfs battery attribute, err: %d\n", hid_warn(hdev, "can't create sysfs battery attribute, err: %d\n",
ret); ret);
/* goto err_battery;
* battery attribute is not critical for the tablet, but if it
* failed then there is no need to create ac attribute
*/
goto move_on;
} }
wdata->ac.properties = wacom_ac_props; wdata->ac.properties = wacom_ac_props;
...@@ -371,14 +367,8 @@ static int wacom_probe(struct hid_device *hdev, ...@@ -371,14 +367,8 @@ static int wacom_probe(struct hid_device *hdev,
if (ret) { if (ret) {
hid_warn(hdev, hid_warn(hdev,
"can't create ac battery attribute, err: %d\n", ret); "can't create ac battery attribute, err: %d\n", ret);
/* goto err_ac;
* ac attribute is not critical for the tablet, but if it
* failed then we don't want to battery attribute to exist
*/
power_supply_unregister(&wdata->battery);
} }
move_on:
#endif #endif
hidinput = list_entry(hdev->inputs.next, struct hid_input, list); hidinput = list_entry(hdev->inputs.next, struct hid_input, list);
input = hidinput->input; input = hidinput->input;
...@@ -416,6 +406,13 @@ static int wacom_probe(struct hid_device *hdev, ...@@ -416,6 +406,13 @@ static int wacom_probe(struct hid_device *hdev,
return 0; return 0;
#ifdef CONFIG_HID_WACOM_POWER_SUPPLY
err_ac:
power_supply_unregister(&wdata->battery);
err_battery:
device_remove_file(&hdev->dev, &dev_attr_speed);
hid_hw_stop(hdev);
#endif
err_free: err_free:
kfree(wdata); kfree(wdata);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment