]> git.hungrycats.org Git - linux/commitdiff
v4l: Release module if subdev registration fails
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Sat, 30 Apr 2011 13:34:05 +0000 (10:34 -0300)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sat, 21 May 2011 22:13:31 +0000 (15:13 -0700)
commit b7534f002d3c81d18abfbf57179d07d3ec763bb5 upstream.

If v4l2_device_register_subdev() fails, the reference to the subdev
module taken by the function isn't released. Fix this.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/media/video/v4l2-device.c

index ce64fe16bc604137d3522af06931ab562983865c..3504fc6d7b71322df7c1a4f1c11b750a8c9de1f9 100644 (file)
@@ -131,14 +131,17 @@ int v4l2_device_register_subdev(struct v4l2_device *v4l2_dev,
        sd->v4l2_dev = v4l2_dev;
        if (sd->internal_ops && sd->internal_ops->registered) {
                err = sd->internal_ops->registered(sd);
-               if (err)
+               if (err) {
+                       module_put(sd->owner);
                        return err;
+               }
        }
        /* This just returns 0 if either of the two args is NULL */
        err = v4l2_ctrl_add_handler(v4l2_dev->ctrl_handler, sd->ctrl_handler);
        if (err) {
                if (sd->internal_ops && sd->internal_ops->unregistered)
                        sd->internal_ops->unregistered(sd);
+               module_put(sd->owner);
                return err;
        }
        spin_lock(&v4l2_dev->lock);