platform/x86: lenovo-yoga-tab2-pro-1380-fastcharger: fix serdev race
[ Upstream commit 59616a91e5e74833b2008b56c66879857c616006 ] The yt2_1380_fc_serdev_probe() function calls devm_serdev_device_open() before setting the client ops via serdev_device_set_client_ops(). This ordering can trigger a NULL pointer dereference in the serdev controller's receive_buf handler, as it assumes serdev->ops is valid when SERPORT_ACTIVE is set. This is similar to the issue fixed in commit5e700b384e("platform/chrome: cros_ec_uart: properly fix race condition") where devm_serdev_device_open() was called before fully initializing the device. Fix the race by ensuring client ops are set before enabling the port via devm_serdev_device_open(). Note, serdev_device_set_baudrate() and serdev_device_set_flow_control() calls should be after the devm_serdev_device_open() call. Fixes:b2ed33e8d4("platform/x86: Add lenovo-yoga-tab2-pro-1380-fastcharger driver") Signed-off-by: Chenyuan Yang <chenyuan0y@gmail.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20250111180951.2277757-1-chenyuan0y@gmail.com Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d3a24d9233
commit
3f67e07873
@@ -199,14 +199,15 @@ static int yt2_1380_fc_serdev_probe(struct serdev_device *serdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
serdev_device_set_drvdata(serdev, fc);
|
||||
serdev_device_set_client_ops(serdev, &yt2_1380_fc_serdev_ops);
|
||||
|
||||
ret = devm_serdev_device_open(dev, serdev);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "opening UART device\n");
|
||||
|
||||
serdev_device_set_baudrate(serdev, 600);
|
||||
serdev_device_set_flow_control(serdev, false);
|
||||
serdev_device_set_drvdata(serdev, fc);
|
||||
serdev_device_set_client_ops(serdev, &yt2_1380_fc_serdev_ops);
|
||||
|
||||
ret = devm_extcon_register_notifier_all(dev, fc->extcon, &fc->nb);
|
||||
if (ret)
|
||||
|
||||
Reference in New Issue
Block a user