• Dmitry Lifshitz's avatar
    [media] tvp5150: fix kernel crash if chip is unavailable · 8cd0d4ca
    Dmitry Lifshitz authored
    tvp5150 driver probe function doesn't check if the chip is present.
    Thus the driver can be loaded without having a device.
    This is dangerous and can cause kernel crash like this:
    
    Kernel BUG at c03c0964 [verbose debug info unavailable]
    Internal error: Oops - BUG: 0 [#1] PREEMPT ARM
    Modules linked in:
    CPU: 0    Tainted: G        W     (3.4.0-cm-t3730+ #2)
    PC is at media_entity_create_link+0xe4/0xf4
    LR is at isp_register_entities+0x228/0x2f4
    pc : [<c03c0964>]    lr : [<c03f3b30>]    psr: 60000013
    sp : cf02de50  ip : 00000000  fp : c079405c
    r10: 00000000  r9 : 00000000  r8 : cf33c800
    r7 : c0794834  r6 : 00000000  r5 : 00000000  r4 : cf365b48
    r3 : 00000000  r2 : cf365b48  r1 : 00000000  r0 : cf33c800
    Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
    Control: 10c5387d  Table: 80004019  DAC: 00000015
    Process swapper (pid: 1, stack limit = 0xcf02c2f0)
    Stack: (0xcf02de50 to 0xcf02e000)
    de40:                                     cf360000 cf366f28 cf366218 c0794834
    de60: cf365b48 00000000 cf33c800 c03f3b30 00000000 00000000 cf360890 cf3668a0
    de80: 00000003 cf360000 c0785a58 00000000 cf360528 00000000 00000000 00003fff
    dea0: cf360500 c03f4cdc c06cc1f4 cf360000 c0785a58 c0d27808 c07d55ec c0785a58
    dec0: c031f0e0 c07d55ec c0776900 000000bb 00000000 c032040c c03203f4 c031ef0c
    dee0: c0785a58 c07d55ec c0785a8c c031f0e0 c075e670 c031f0c8 cf02deb8 c0785a58
    df00: c07d55ec c031f174 c07d55ec 00000000 cf02df18 c031d7a0 cf01d4a8 cf068b10
    df20: 00000000 c07d55ec c07c74d0 cf34bcc0 00000000 c031ded8 c0672340 c054cd38
    df40: 00000000 c07e68c0 c07d55ec 00000000 00000000 c075e670 c0776900 000000bb
    df60: 00000000 c031f770 c07e68c0 00000007 c07e68c0 00000000 c075e670 c0008790
    df80: 000000bb 00000006 00000006 c066e650 cf02dfa4 c07689b8 c07689b8 00000007
    dfa0: c07e68c0 c073f2e8 c07689c0 000000bb 00000000 c073f2bc 00000006 00000006
    dfc0: c073f2e8 00000000 c077649c c077649c c00150cc 00000013 00000000 00000000
    dfe0: 00000000 c073f3cc cf02dfe8 00000000 c073f368 c00150cc 00000000 00000000
    [<c03c0964>] (media_entity_create_link+0xe4/0xf4) from [<c03f3b30>] (isp_register_entities+0x228/0x2f4)
    [<c03f3b30>] (isp_register_entities+0x228/0x2f4) from [<c03f4cdc>] (isp_probe+0x7ac/0x9b8)
    [<c03f4cdc>] (isp_probe+0x7ac/0x9b8) from [<c032040c>] (platform_drv_probe+0x18/0x1c)
    [<c032040c>] (platform_drv_probe+0x18/0x1c) from [<c031ef0c>] (really_probe+0x64/0x1d8)
    [<c031ef0c>] (really_probe+0x64/0x1d8) from [<c031f0c8>] (driver_probe_device+0x48/0x60)
    [<c031f0c8>] (driver_probe_device+0x48/0x60) from [<c031f174>] (__driver_attach+0x94/0x98)
    [<c031f174>] (__driver_attach+0x94/0x98) from [<c031d7a0>] (bus_for_each_dev+0x54/0x80)
    [<c031d7a0>] (bus_for_each_dev+0x54/0x80) from [<c031ded8>] (bus_add_driver+0xac/0x2a8)
    [<c031ded8>] (bus_add_driver+0xac/0x2a8) from [<c031f770>] (driver_register+0x78/0x180)
    [<c031f770>] (driver_register+0x78/0x180) from [<c0008790>] (do_one_initcall+0x34/0x184)
    [<c0008790>] (do_one_initcall+0x34/0x184) from [<c073f2bc>] (do_basic_setup+0x9c/0xc8)
    [<c073f2bc>] (do_basic_setup+0x9c/0xc8) from [<c073f3cc>] (kernel_init+0x64/0xec)
    [<c073f3cc>] (kernel_init+0x64/0xec) from [<c00150cc>] (kernel_thread_exit+0x0/0x8)
    Code: e1c812b6 e8bd87f0 e7f001f2 eafffffe (e7f001f2)
    
    ---[ end trace 3ed3c618b26ff3e8 ]---
    Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
    
    This patch fixes the tvp5150_read() function to return an error in case
    the I2C transaction fails.
    tvp5150_probe() and other relevant driver callbacks changed to check the
    status of the I2C read operations.
    In case of a read error throw an error message with v4l2_err()
    instead of v4l2_dbg().
    
    [mchehab@redhat.com: Fix a small typo breaking compilation]
    Signed-off-by: default avatarDmitry Lifshitz <lifshitz@compulab.co.il>
    Signed-off-by: default avatarIgor Grinberg <grinberg@compulab.co.il>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
    8cd0d4ca
tvp5150.c 33.3 KB