Skip to content

Commit 1b2128a

Browse files
WhiteFox-Projectij-intel
authored andcommitted
platform/x86: dell-uart-backlight: fix serdev race
The dell_uart_bl_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: 484bae9 ("platform/x86: Add new Dell UART backlight driver") Signed-off-by: Chenyuan Yang <chenyuan0y@gmail.com> Reviewed-by: Hans de Goede <hdegoede@redhat.com> Link: https://lore.kernel.org/r/20250111180118.2274516-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>
1 parent 1d7461d commit 1b2128a

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

drivers/platform/x86/dell/dell-uart-backlight.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,15 +283,16 @@ static int dell_uart_bl_serdev_probe(struct serdev_device *serdev)
283283
init_waitqueue_head(&dell_bl->wait_queue);
284284
dell_bl->dev = dev;
285285

286+
serdev_device_set_drvdata(serdev, dell_bl);
287+
serdev_device_set_client_ops(serdev, &dell_uart_bl_serdev_ops);
288+
286289
ret = devm_serdev_device_open(dev, serdev);
287290
if (ret)
288291
return dev_err_probe(dev, ret, "opening UART device\n");
289292

290293
/* 9600 bps, no flow control, these are the default but set them to be sure */
291294
serdev_device_set_baudrate(serdev, 9600);
292295
serdev_device_set_flow_control(serdev, false);
293-
serdev_device_set_drvdata(serdev, dell_bl);
294-
serdev_device_set_client_ops(serdev, &dell_uart_bl_serdev_ops);
295296

296297
get_version[0] = DELL_SOF(GET_CMD_LEN);
297298
get_version[1] = CMD_GET_VERSION;

0 commit comments

Comments
 (0)