[PATCH 11/12] iio: accel: kionix-kx022a: Prevent memory leak and fix state
Matti Vaittinen <[email protected]>
| Newsgroups | org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <85e6bd3998863e0247c52dcf0c1486b2cddff567.1786347811.git.mazziesaccount@gmail.com> |
From: Matti Vaittinen <[email protected]> The driver allocates memory for samples at buffer enable path. If regmap operation fails in the kx022a_fifo_enable() at the buffer enable path, the allocated memory is never freed. Furthermore, the state information and previous hardware configuration(s) aren't undone, potentially leaving WMI interrupts and buffers enabled, or driver state flags wrong. Free the memory and revert the hardware configuration and state flags on error path. Signed-off-by: Matti Vaittinen <[email protected]> Fixes: e7123a4dfcd7 ("iio: accel: kionix-kx022a: Refactor driver and add chip_info structure") --- drivers/iio/accel/kionix-kx022a.c | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/drivers/iio/accel/kionix-kx022a.c b/drivers/iio/accel/kionix-kx022a.c index 8a13f78aeab0..49e8b4b943da 100644 --- a/drivers/iio/accel/kionix-kx022a.c +++ b/drivers/iio/accel/kionix-kx022a.c @@ -980,26 +980,43 @@ static int kx022a_fifo_enable(struct kx022a_data *data) guard(mutex)(&data->mutex); ret = __kx022a_turn_on_off(data, false); if (ret) - return ret; + goto err_free_out; /* Update watermark to HW */ ret = kx022a_fifo_set_wmi(data); if (ret) - return ret; + goto err_free_out; /* Enable buffer */ ret = regmap_set_bits(data->regmap, data->chip_info->buf_cntl2, KX022A_MASK_BUF_EN); if (ret) - return ret; + goto err_free_out; data->state |= KX022A_STATE_FIFO; ret = regmap_set_bits(data->regmap, data->ien_reg, KX022A_MASK_WMI); if (ret) - return ret; + goto err_wmi_out; - return __kx022a_turn_on_off(data, true); + ret = __kx022a_turn_on_off(data, true); + if (ret) + goto err_on_out; + + return ret; + +err_on_out: + regmap_clear_bits(data->regmap, data->ien_reg, + KX022A_MASK_WMI); +err_wmi_out: + regmap_clear_bits(data->regmap, data->chip_info->buf_cntl2, + KX022A_MASK_BUF_EN); +err_free_out: + kfree(data->fifo_buffer); + data->state &= ~KX022A_STATE_FIFO; + __kx022a_turn_on_off(data, true); + + return ret; } static int kx022a_buffer_postenable(struct iio_dev *idev) -- 2.55.0
signature.asc
(application/pgp-signature, 488 B)
-----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEIx+f8wZb28fLKEhTeFA3/03aocUFAmp5g9cACgkQeFA3/03a ocVxLgf+L4sKnnXX2zgpws7llF5AQpcUzcmAMoiF8/NLGnUPgiS7yXnl0vDFiv77 KII2TA2JWnonePhWLkXADj0ADUzEJ7wqUxTnxsJ8bRuqrFD6cHSvxcB5QpT/yUu2 gc/cvyEwl4Xin3XGVUAsixOHehH7oV19iq0mWJCIBS2zzOXzcTYxPtRrcbU/XOJW kT5473PBPBJJ0bq3QgOfveWypdYrGHfdVrmCqsqtcuQ2m4qbE9ZaPEYrz1vt6VI2 lo005mlVj4lxxIps8DJY+cZioSRjZfpPdmxZlABBq37OdjauU5i/662yzwD4M7jT OC3NOD5GNUzFjt4tDHeDr9E3qaKrtA== =jKJR -----END PGP SIGNATURE-----