]> www.infradead.org Git - users/hch/misc.git/commitdiff
media: pci: ivtv: Add missing check after DMA map
authorThomas Fourier <fourier.thomas@gmail.com>
Wed, 16 Jul 2025 13:26:30 +0000 (15:26 +0200)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Fri, 29 Aug 2025 09:04:02 +0000 (11:04 +0200)
The DMA map functions can fail and should be tested for errors.
If the mapping fails, free blanking_ptr and set it to 0.  As 0 is a
valid DMA address, use blanking_ptr to test if the DMA address
is set.

Fixes: 1a0adaf37c30 ("V4L/DVB (5345): ivtv driver for Conexant cx23416/cx23415 MPEG encoder/decoder")
Cc: stable@vger.kernel.org
Signed-off-by: Thomas Fourier <fourier.thomas@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
drivers/media/pci/ivtv/ivtv-irq.c
drivers/media/pci/ivtv/ivtv-yuv.c

index 20ba5ae9c6d1d0e6e4d856d1f083e30a0f9be321..078d9cd77c710aa0b61d1cc56689300826a7e109 100644 (file)
@@ -351,7 +351,7 @@ void ivtv_dma_stream_dec_prepare(struct ivtv_stream *s, u32 offset, int lock)
 
        /* Insert buffer block for YUV if needed */
        if (s->type == IVTV_DEC_STREAM_TYPE_YUV && f->offset_y) {
-               if (yi->blanking_dmaptr) {
+               if (yi->blanking_ptr) {
                        s->sg_pending[idx].src = yi->blanking_dmaptr;
                        s->sg_pending[idx].dst = offset;
                        s->sg_pending[idx].size = 720 * 16;
index 2d9274537725af594f635411c5ba51eab13e3d89..71f0401066471a7035376925281ad8e4756f0036 100644 (file)
@@ -125,7 +125,7 @@ static int ivtv_yuv_prep_user_dma(struct ivtv *itv, struct ivtv_user_dma *dma,
        ivtv_udma_fill_sg_array(dma, y_buffer_offset, uv_buffer_offset, y_size);
 
        /* If we've offset the y plane, ensure top area is blanked */
-       if (f->offset_y && yi->blanking_dmaptr) {
+       if (f->offset_y && yi->blanking_ptr) {
                dma->SGarray[dma->SG_length].size = cpu_to_le32(720*16);
                dma->SGarray[dma->SG_length].src = cpu_to_le32(yi->blanking_dmaptr);
                dma->SGarray[dma->SG_length].dst = cpu_to_le32(IVTV_DECODER_OFFSET + yuv_offset[frame]);
@@ -929,6 +929,12 @@ static void ivtv_yuv_init(struct ivtv *itv)
                yi->blanking_dmaptr = dma_map_single(&itv->pdev->dev,
                                                     yi->blanking_ptr,
                                                     720 * 16, DMA_TO_DEVICE);
+               if (dma_mapping_error(&itv->pdev->dev, yi->blanking_dmaptr)) {
+                       kfree(yi->blanking_ptr);
+                       yi->blanking_ptr = NULL;
+                       yi->blanking_dmaptr = 0;
+                       IVTV_DEBUG_WARN("Failed to dma_map yuv blanking buffer\n");
+               }
        } else {
                yi->blanking_dmaptr = 0;
                IVTV_DEBUG_WARN("Failed to allocate yuv blanking buffer\n");