media: tw686x: Fix oops on buffer alloc failure
authorKrzysztof Ha?asa <khalasa@piap.pl>
Thu, 28 Jun 2018 21:45:07 +0000 (17:45 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Wed, 25 Jul 2018 12:34:28 +0000 (08:34 -0400)
The error path currently calls tw686x_video_free() which requires
vc->dev to be initialized, causing a NULL dereference on uninitizalized
channels.

Fix this by setting the vc->dev fields for all the channels first.

Fixes: f8afaa8dbc0d ("[media] tw686x: Introduce an interface to support multiple DMA modes")

Signed-off-by: Krzysztof Ha?asa <khalasa@piap.pl>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/pci/tw686x/tw686x-video.c

index 0ea8dd4..3a06c00 100644 (file)
@@ -1190,6 +1190,14 @@ int tw686x_video_init(struct tw686x_dev *dev)
                        return err;
        }
 
+       /* Initialize vc->dev and vc->ch for the error path */
+       for (ch = 0; ch < max_channels(dev); ch++) {
+               struct tw686x_video_channel *vc = &dev->video_channels[ch];
+
+               vc->dev = dev;
+               vc->ch = ch;
+       }
+
        for (ch = 0; ch < max_channels(dev); ch++) {
                struct tw686x_video_channel *vc = &dev->video_channels[ch];
                struct video_device *vdev;
@@ -1198,9 +1206,6 @@ int tw686x_video_init(struct tw686x_dev *dev)
                spin_lock_init(&vc->qlock);
                INIT_LIST_HEAD(&vc->vidq_queued);
 
-               vc->dev = dev;
-               vc->ch = ch;
-
                /* default settings */
                err = tw686x_set_standard(vc, V4L2_STD_NTSC);
                if (err)