dmatest: Fix NULL pointer dereference on ioat
PATCH 1/1 dmatest: Fix NULL pointer dereference on ioat
device_control is an optional and not implemented in all DMA drivers. Any calls to these will result in a NULL pointer dereference. dmatest makes two of these calls when completing the kernel thread and removing the module. These are corrected by calling the dmaengine_device_control wrapper and checking for a non-existant device_control function pointer there.
--- drivers/dma/dmatest.c | 4 ++-- include/linux/dmaengine.h | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-)
drivers/dma/dmatest.c +2 -2
@@ -499,7 +499,7 @@ err_srcs: thread_name, total_tests, failed_tests, ret);/* terminate all transfers on specified channels */ - chan->device->device_control (chan,DMA_TERMINATE_ALL ,0 ); +dmaengine_terminate_all (chan);if (iterations >0 )while (!kthread_should_stop ()) {DECLARE_WAIT_QUEUE_HEAD_ONSTACK (wait_dmatest_exit);
@@ -524,7 +524,7 @@ static void dmatest_cleanup_channel(struct dmatest_chan *dtc) }/* terminate all transfers on specified channels */ - dtc->chan->device->device_control (dtc->chan,DMA_TERMINATE_ALL ,0 ); +dmaengine_terminate_all (dtc->chan);kfree (dtc); }
include/linux/dmaengine.h +4 -1
@@ -608,7 +608,10 @@ static inline int dmaengine_device_control(struct dma_chan *chan,enum dma_ctrl_cmd cmd, unsigned long arg) { -return chan->device->device_control (chan, cmd, arg); + if (chan->device->device_control) + return chan->device->device_control(chan, cmd, arg); + else + return -EINVAL; } static inline int dmaengine_slave_config(struct dma_chan *chan,
Signature · 1 line
1.7.9.5
Quoted 21 lines · Jon Mason
device_controlis an optional and not implemented in all DMA drivers. Any calls to these will result in a NULL pointer dereference. dmatest makes two of these calls when completing the kernel thread and removing the module. These are corrected by calling thedmaengine_device_controlwrapper and checking for a non-existantdevice_controlfunction pointer there.Signed-off-by Jon Mason <[email protected]>CC Vinod Koul <[email protected]>CC Dan Williams <[email protected]>--- drivers/dma/dmatest.c | 4 ++-- include/linux/dmaengine.h | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-)include/linux/dmaengine.h +0
-0
include/linux/dmaengine.h static inline int dmaengine_device_control(struct dma_chan *chan, · line 614
Quoted 8 lines
include/linux/dmaengine.h +4
-1@@ -608,7 +608,10 @@ static inline int dmaengine_device_control(struct dma_chan *chan,enum dma_ctrl_cmd cmd, unsigned long arg) { -return chan->device->device_control (chan, cmd, arg); + if (chan->device->device_control) + return chan->device->device_control(chan, cmd, arg); + else + return -EINVAL;
-ENOTSUPP or -ENOSYS ??
@Dan: I believe i don't have to send another version now. Correct??
--
viresh
Quoted 17 lines · viresh kumar
Quoted 15 lines · Jon Mason
device_controlis an optional and not implemented in all DMA drivers. Any calls to these will result in a NULL pointer dereference. dmatest makes two of these calls when completing the kernel thread and removing the module. These are corrected by calling thedmaengine_device_controlwrapper and checking for a non-existantdevice_controlfunction pointer there.Signed-off-by Jon Mason <[email protected]>CC Vinod Koul <[email protected]>CC Dan Williams <[email protected]>--- drivers/dma/dmatest.c | 4 ++-- include/linux/dmaengine.h | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-)
Quoted 15 lines
include/linux/dmaengine.h static inline int dmaengine_device_control(struct dma_chan *chan, · line 614
Quoted 13 lines
include/linux/dmaengine.h +4
-1@@ -608,7 +608,10 @@ static inline int dmaengine_device_control(struct dma_chan *chan,enum dma_ctrl_cmd cmd, unsigned long arg) { -return chan->device->device_control (chan, cmd, arg); + if (chan->device->device_control) + return chan->device->device_control(chan, cmd, arg); + else + return -EINVAL;
-ENOTSUPPor-ENOSYS??
ENOSYS makes more sense to me. I'll send out another version shortly.
Dan, do you want me to send the patch to Greg KH for inclusion in the stable branches back to v3.2?
Thanks,
Jon
Quoted 5 lines
@Dan: I believe i don't have to send another version now. Correct??
--
viresh