• Xin Long's avatar
    sctp: change to hold/put transport for proto_unreach_timer · 057a10fa
    Xin Long authored
    A call trace was found in Hangbin's Codenomicon testing with debug kernel:
    
      [ 2615.981988] ODEBUG: free active (active state 0) object type: timer_list hint: sctp_generate_proto_unreach_event+0x0/0x3a0 [sctp]
      [ 2615.995050] WARNING: CPU: 17 PID: 0 at lib/debugobjects.c:328 debug_print_object+0x199/0x2b0
      [ 2616.095934] RIP: 0010:debug_print_object+0x199/0x2b0
      [ 2616.191533] Call Trace:
      [ 2616.194265]  <IRQ>
      [ 2616.202068]  debug_check_no_obj_freed+0x25e/0x3f0
      [ 2616.207336]  slab_free_freelist_hook+0xeb/0x140
      [ 2616.220971]  kfree+0xd6/0x2c0
      [ 2616.224293]  rcu_do_batch+0x3bd/0xc70
      [ 2616.243096]  rcu_core+0x8b9/0xd00
      [ 2616.256065]  __do_softirq+0x23d/0xacd
      [ 2616.260166]  irq_exit+0x236/0x2a0
      [ 2616.263879]  smp_apic_timer_interrupt+0x18d/0x620
      [ 2616.269138]  apic_timer_interrupt+0xf/0x20
      [ 2616.273711]  </IRQ>
    
    This is because it holds asoc when transport->proto_unreach_timer starts
    and puts asoc when the timer stops, and without holding transport the
    transport could be freed when the timer is still running.
    
    So fix it by holding/putting transport instead for proto_unreach_timer
    in transport, just like other timers in transport.
    
    v1->v2:
      - Also use sctp_transport_put() for the "out_unlock:" path in
        sctp_generate_proto_unreach_event(), as Marcelo noticed.
    
    Fixes: 50b5d6ad ("sctp: Fix a race between ICMP protocol unreachable and connect()")
    Reported-by: default avatarHangbin Liu <liuhangbin@gmail.com>
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Link: https://lore.kernel.org/r/102788809b554958b13b95d33440f5448113b8d6.1605331373.git.lucien.xin@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    057a10fa
sm_sideeffect.c 50.6 KB