• Jesper Juhl's avatar
    V4L/DVB (4154): Fix use-after-free bug in cpia2 driver · bafefc0c
    Jesper Juhl authored
    The coverity checker detected a use-after-free error in
    drivers/media/video/cpia2/cpia2_v4l.c::cpia2_close() (coverity
    error #1281).
    What happens is that we lock cam->busy_lock, then proceed to free
    resources, and in the case of (--cam->open_count == 0) we finish off by
    doing a kfree(cam) and then at the end of the function we do a
    mutex_unlock(&cam->busy_lock) which will explode since it'll dereference
    the free'd `cam' :
    ...
    mutex_lock(&cam->busy_lock);
    ...
    if (--cam->open_count == 0) {
        ...
        if (!cam->present) {
            video_unregister_device(dev);
            kfree(cam);
        }
    }
    mutex_unlock(&cam->busy_lock);   <--- PROBLEM, cam no longer around.
    ...
    Since this only happens in the case of open_count going down to zero I
    don't see a problem with just releasing the mutex after unregistering the
    device and just before the kfree().  In this case there is nothing around
    that we can race against; we are in the release method, open_count is zero,
    (!cam->present) and the device has just been unregistered, so letting go of
    the mutex at this point looks safe to me.
    Patch below to implement that solution.
    Acked-by: default avatarRandy Dunlap <rdunlap@xenotime.net>
    Signed-off-by: default avatarJesper Juhl <jesper.juhl@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
    bafefc0c
cpia2_v4l.c 50.4 KB