• David Härdeman's avatar
    [media] ir-lirc-codec: let lirc_dev handle the lirc_buffer · 0f7c4063
    David Härdeman authored
    ir_lirc_register() currently creates its own lirc_buffer before
    passing the lirc_driver to lirc_register_driver().
    
    When a module is later unloaded, ir_lirc_unregister() gets called
    which performs a call to lirc_unregister_driver() and then free():s
    the lirc_buffer.
    
    The problem is that:
    
    a) there can still be a userspace app holding an open lirc fd
       when lirc_unregister_driver() returns; and
    
    b) the lirc_buffer contains "wait_queue_head_t wait_poll" which
       is potentially used as long as any userspace app is still around.
    
    The result is an oops which can be triggered quite easily by a
    userspace app monitoring its lirc fd using epoll() and not closing
    the fd promptly on device removal.
    
    The minimalistic fix is to let lirc_dev create the lirc_buffer since
    lirc_dev will then also free the buffer once it believes it is safe to
    do so.
    Signed-off-by: default avatarDavid Härdeman <david@hardeman.nu>
    Signed-off-by: default avatarSean Young <sean@mess.org>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
    0f7c4063
ir-lirc-codec.c 9.88 KB