• Xin Long's avatar
    sctp: fix a SCTP_MIB_CURRESTAB leak in sctp_sf_do_dupcook_b · f282df03
    Xin Long authored
    Normally SCTP_MIB_CURRESTAB is always incremented once asoc enter into
    ESTABLISHED from the state < ESTABLISHED and decremented when the asoc
    is being deleted.
    
    However, in sctp_sf_do_dupcook_b(), the asoc's state can be changed to
    ESTABLISHED from the state >= ESTABLISHED where it shouldn't increment
    SCTP_MIB_CURRESTAB. Otherwise, one asoc may increment MIB_CURRESTAB
    multiple times but only decrement once at the end.
    
    I was able to reproduce it by using scapy to do the 4-way shakehands,
    after that I replayed the COOKIE-ECHO chunk with 'peer_vtag' field
    changed to different values, and SCTP_MIB_CURRESTAB was incremented
    multiple times and never went back to 0 even when the asoc was freed.
    
    This patch is to fix it by only incrementing SCTP_MIB_CURRESTAB when
    the state < ESTABLISHED in sctp_sf_do_dupcook_b().
    
    Fixes: 1da177e4 ("Linux-2.6.12-rc2")
    Reported-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f282df03
sm_statefuns.c 206 KB