Skip to content

Commit 59616a9

Browse files
WhiteFox-Projectij-intel
authored andcommitted
platform/x86: lenovo-yoga-tab2-pro-1380-fastcharger: fix serdev race
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 commit 5e700b3 ("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: b2ed33e ("platform/x86: Add lenovo-yoga-tab2-pro-1380-fastcharger driver") Signed-off-by: Chenyuan Yang <[email protected]> Reviewed-by: Hans de Goede <[email protected]> Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Ilpo Järvinen <[email protected]> Signed-off-by: Ilpo Järvinen <[email protected]>
1 parent 1b2128a commit 59616a9

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

drivers/platform/x86/lenovo-yoga-tab2-pro-1380-fastcharger.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,14 +199,15 @@ static int yt2_1380_fc_serdev_probe(struct serdev_device *serdev)
199199
if (ret)
200200
return ret;
201201

202+
serdev_device_set_drvdata(serdev, fc);
203+
serdev_device_set_client_ops(serdev, &yt2_1380_fc_serdev_ops);
204+
202205
ret = devm_serdev_device_open(dev, serdev);
203206
if (ret)
204207
return dev_err_probe(dev, ret, "opening UART device\n");
205208

206209
serdev_device_set_baudrate(serdev, 600);
207210
serdev_device_set_flow_control(serdev, false);
208-
serdev_device_set_drvdata(serdev, fc);
209-
serdev_device_set_client_ops(serdev, &yt2_1380_fc_serdev_ops);
210211

211212
ret = devm_extcon_register_notifier_all(dev, fc->extcon, &fc->nb);
212213
if (ret)

0 commit comments

Comments
 (0)