mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
synced 2025-04-19 20:58:31 +09:00
w1: fix NULL pointer dereference in probe
The w1_uart_probe() function calls w1_uart_serdev_open() (which includes 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 5e700b384ec1 ("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 w1_uart_serdev_open(). Fixes: a3c08804364e ("w1: add UART w1 bus driver") Signed-off-by: Chenyuan Yang <chenyuan0y@gmail.com> Acked-by: Christoph Winklhofer <cj.winklhofer@gmail.com> Link: https://lore.kernel.org/r/20250111181803.2283611-1-chenyuan0y@gmail.com Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
This commit is contained in:
parent
2014c95afe
commit
0dd6770a72
@ -372,11 +372,11 @@ static int w1_uart_probe(struct serdev_device *serdev)
|
||||
init_completion(&w1dev->rx_byte_received);
|
||||
mutex_init(&w1dev->rx_mutex);
|
||||
|
||||
serdev_device_set_drvdata(serdev, w1dev);
|
||||
serdev_device_set_client_ops(serdev, &w1_uart_serdev_ops);
|
||||
ret = w1_uart_serdev_open(w1dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
serdev_device_set_drvdata(serdev, w1dev);
|
||||
serdev_device_set_client_ops(serdev, &w1_uart_serdev_ops);
|
||||
|
||||
return w1_add_master_device(&w1dev->bus);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user