Message ID | 1c67249dbc78678c451a155c04ef908627da6d1a.1732776187.git.xiaopei01@kylinos.cn (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | iio: adc: at91-sama5d2_adc: Fix use-after-free in sama5d2_adc driver | expand |
Hello, On 11/28/24 08:45, Pei Xiao wrote: > at91_adc_interrupt can call at91_adc_touch_data_handler function > to start the work by schedule_work(&st->touch_st.workq). > > If we remove the module which will call at91_adc_remove to > make cleanup, it will free indio_dev through iio_device_unregister > while the work mentioned above will be used. The sequence of operations > that may lead to a UAF bug is as follows: > > CPU0 CPU1 > > | at91_adc_workq_handler > at91_adc_remove | > iio_device_unregister(indio_dev) | > device_release | > //free indio_dev | > | iio_push_to_buffers(indio_dev) > | //use indio_dev > > Fix it by ensuring that the work is canceled before proceeding with > the cleanup in at91_adc_remove. > > Fixes: 27e177190891 ("iio:adc:at91_adc8xx: introduce new atmel adc driver") I believe that the commit that introduced the workqueue is different than the one you tagged here. With that changed, Reviewed-by: Eugen Hristev <eugen.hristev@linaro.org> > Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn> > --- > drivers/iio/adc/at91-sama5d2_adc.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c > index 8e5aaf15a921..4ba52b500054 100644 > --- a/drivers/iio/adc/at91-sama5d2_adc.c > +++ b/drivers/iio/adc/at91-sama5d2_adc.c > @@ -2491,6 +2491,7 @@ static void at91_adc_remove(struct platform_device *pdev) > struct iio_dev *indio_dev = platform_get_drvdata(pdev); > struct at91_adc_state *st = iio_priv(indio_dev); > > + cancel_work_sync(&st->touch_st.workq); > iio_device_unregister(indio_dev); > > at91_adc_dma_disable(st);
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c index 8e5aaf15a921..4ba52b500054 100644 --- a/drivers/iio/adc/at91-sama5d2_adc.c +++ b/drivers/iio/adc/at91-sama5d2_adc.c @@ -2491,6 +2491,7 @@ static void at91_adc_remove(struct platform_device *pdev) struct iio_dev *indio_dev = platform_get_drvdata(pdev); struct at91_adc_state *st = iio_priv(indio_dev); + cancel_work_sync(&st->touch_st.workq); iio_device_unregister(indio_dev); at91_adc_dma_disable(st);
at91_adc_interrupt can call at91_adc_touch_data_handler function to start the work by schedule_work(&st->touch_st.workq). If we remove the module which will call at91_adc_remove to make cleanup, it will free indio_dev through iio_device_unregister while the work mentioned above will be used. The sequence of operations that may lead to a UAF bug is as follows: CPU0 CPU1 | at91_adc_workq_handler at91_adc_remove | iio_device_unregister(indio_dev) | device_release | //free indio_dev | | iio_push_to_buffers(indio_dev) | //use indio_dev Fix it by ensuring that the work is canceled before proceeding with the cleanup in at91_adc_remove. Fixes: 27e177190891 ("iio:adc:at91_adc8xx: introduce new atmel adc driver") Signed-off-by: Pei Xiao <xiaopei01@kylinos.cn> --- drivers/iio/adc/at91-sama5d2_adc.c | 1 + 1 file changed, 1 insertion(+)