• Q
    sctp: fix refcount bug in sctp_wfree · 5c3e82fe
    Qiujun Huang 提交于
    We should iterate over the datamsgs to move
    all chunks(skbs) to newsk.
    
    The following case cause the bug:
    for the trouble SKB, it was in outq->transmitted list
    
    sctp_outq_sack
            sctp_check_transmitted
                    SKB was moved to outq->sacked list
            then throw away the sack queue
                    SKB was deleted from outq->sacked
    (but it was held by datamsg at sctp_datamsg_to_asoc
    So, sctp_wfree was not called here)
    
    then migrate happened
    
            sctp_for_each_tx_datachunk(
            sctp_clear_owner_w);
            sctp_assoc_migrate();
            sctp_for_each_tx_datachunk(
            sctp_set_owner_w);
    SKB was not in the outq, and was not changed to newsk
    
    finally
    
    __sctp_outq_teardown
            sctp_chunk_put (for another skb)
                    sctp_datamsg_put
                            __kfree_skb(msg->frag_list)
                                    sctp_wfree (for SKB)
    	SKB->sk was still oldsk (skb->sk != asoc->base.sk).
    
    Reported-and-tested-by: syzbot+cea71eec5d6de256d54d@syzkaller.appspotmail.com
    Signed-off-by: NQiujun Huang <hqjagain@gmail.com>
    Acked-by: NMarcelo Ricardo Leitner <mleitner@redhat.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    5c3e82fe
socket.c 262.8 KB