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: David Herrmann <dh.herrmann@googlemail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
committed by
Jiri Kosina
parent
6d1db07779
commit
dde58cfcc3
@@ -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,
|
|||||||
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 @@ move_on:
|
|||||||
|
|
||||||
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;
|
||||||
|
Reference in New Issue
Block a user