• Xin Long's avatar
    sctp: check asoc strreset_chunk in sctp_generate_reconf_event · 165e3e17
    Xin Long authored
    A null pointer reference issue can be triggered when the response of a
    stream reconf request arrives after the timer is triggered, such as:
    
      send Incoming SSN Reset Request --->
      CPU0:
       reconf timer is triggered,
       go to the handler code before hold sk lock
                                <--- reply with Outgoing SSN Reset Request
      CPU1:
       process Outgoing SSN Reset Request,
       and set asoc->strreset_chunk to NULL
      CPU0:
       continue the handler code, hold sk lock,
       and try to hold asoc->strreset_chunk, crash!
    
    In Ying Xu's testing, the call trace is:
    
      [ ] BUG: kernel NULL pointer dereference, address: 0000000000000010
      [ ] RIP: 0010:sctp_chunk_hold+0xe/0x40 [sctp]
      [ ] Call Trace:
      [ ]  <IRQ>
      [ ]  sctp_sf_send_reconf+0x2c/0x100 [sctp]
      [ ]  sctp_do_sm+0xa4/0x220 [sctp]
      [ ]  sctp_generate_reconf_event+0xbd/0xe0 [sctp]
      [ ]  call_timer_fn+0x26/0x130
    
    This patch is to fix it by returning from the timer handler if asoc
    strreset_chunk is already set to NULL.
    
    Fixes: 7b9438de ("sctp: add stream reconf timer")
    Reported-by: default avatarYing Xu <yinxu@redhat.com>
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    165e3e17
sm_sideeffect.c 50.9 KB