• D
    media: zr364xx: fix memory leaks in probe() · ea354b6d
    Dan Carpenter 提交于
    Syzbot discovered that the probe error handling doesn't clean up the
    resources allocated in zr364xx_board_init().  There are several
    related bugs in this code so I have re-written the error handling.
    
    1)  Introduce a new function zr364xx_board_uninit() which cleans up
        the resources in zr364xx_board_init().
    2)  In zr364xx_board_init() if the call to zr364xx_start_readpipe()
        fails then release the "cam->buffer.frame[i].lpvbits" memory
        before returning.  This way every function either allocates
        everything successfully or it cleans up after itself.
    3)  Re-write the probe function so that each failure path goto frees
        the most recent allocation.  That way we don't free anything
        before it has been allocated and we can also verify that
        everything is freed.
    4)  Originally, in the probe function the "cam->v4l2_dev.release"
        pointer was set to "zr364xx_release" near the start but I moved
        that assignment to the end, after everything had succeeded.  The
        release function was never actually called during the probe cleanup
        process, but with this change I wanted to make it clear that we
        don't want to call zr364xx_release() until everything is
        allocated successfully.
    
    Next I re-wrote the zr364xx_release() function.  Ideally this would
    have been a simple matter of copy and pasting the cleanup code from
    probe and adding an additional call to video_unregister_device().  But
    there are a couple quirks to note.
    
    1)  The probe function does not call videobuf_mmap_free() and I don't
        know where the videobuf_mmap is allocated.  I left the code as-is to
        avoid introducing a bug in code I don't understand.
    2)  The zr364xx_board_uninit() has a call to zr364xx_stop_readpipe()
        which is a change from the original behavior with regards to
        unloading the driver.  Calling zr364xx_stop_readpipe() on a stopped
        pipe is not a problem so this is safe and is potentially a bugfix.
    
    Reported-by: syzbot+b4d54814b339b5c6bbd4@syzkaller.appspotmail.com
    Signed-off-by: NDan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: NHans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: NMauro Carvalho Chehab <mchehab+huawei@kernel.org>
    ea354b6d
zr364xx.c 40.9 KB