linux/drivers/media/platform/mediatek/jpeg
Fan Wu 34c519feef media: mtk-jpeg: fix use-after-free in release path due to uncancelled work
The mtk_jpeg_release() function frees the context structure (ctx) without
first cancelling any pending or running work in ctx->jpeg_work. This
creates a race window where the workqueue callback may still be accessing
the context memory after it has been freed.

Race condition:

    CPU 0 (release)                    CPU 1 (workqueue)
    ----------------                   ------------------
    close()
      mtk_jpeg_release()
                                       mtk_jpegenc_worker()
                                         ctx = work->data
                                         // accessing ctx

        kfree(ctx)  // freed!
                                         access ctx  // UAF!

The work is queued via queue_work() during JPEG encode/decode operations
(via mtk_jpeg_device_run). If the device is closed while work is pending
or running, the work handler will access freed memory.

Fix this by calling cancel_work_sync() BEFORE acquiring the mutex. This
ordering is critical: if cancel_work_sync() is called after mutex_lock(),
and the work handler also tries to acquire the same mutex, it would cause
a deadlock.

Note: The open error path does NOT need cancel_work_sync() because
INIT_WORK() only initializes the work structure - it does not schedule
it. Work is only scheduled later during ioctl operations.

Fixes: 5fb1c2361e ("mtk-jpegenc: add jpeg encode worker interface")
Cc: stable@vger.kernel.org
Signed-off-by: Fan Wu <fanwu01@zju.edu.cn>
Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
2026-03-23 11:18:34 +01:00
..
Kconfig
Makefile media: mtk-jpegdec: support jpegdec multi-hardware 2022-09-30 16:39:29 +02:00
mtk_jpeg_core.c media: mtk-jpeg: fix use-after-free in release path due to uncancelled work 2026-03-23 11:18:34 +01:00
mtk_jpeg_core.h media: mediatek: jpeg: support 34bits 2025-05-15 08:13:31 +02:00
mtk_jpeg_dec_hw.c media: v4l2-mem2mem: Don't copy frame flags in v4l2_m2m_buf_copy_metadata() 2025-10-17 11:31:16 +02:00
mtk_jpeg_dec_hw.h media: mediatek: jpeg: support 34bits 2025-05-15 08:13:31 +02:00
mtk_jpeg_dec_parse.c media: Add common header file with JPEG marker definitions 2023-05-25 16:21:21 +02:00
mtk_jpeg_dec_parse.h
mtk_jpeg_dec_reg.h media: mediatek: jpeg: support 34bits 2025-05-15 08:13:31 +02:00
mtk_jpeg_enc_hw.c media: v4l2-mem2mem: Don't copy frame flags in v4l2_m2m_buf_copy_metadata() 2025-10-17 11:31:16 +02:00
mtk_jpeg_enc_hw.h media: mediatek: jpeg: support 34bits 2025-05-15 08:13:31 +02:00