• Xin Long's avatar
    sctp: count sk_wmem_alloc by skb truesize in sctp_packet_transmit · 02968ccf
    Xin Long authored
    Now sctp increases sk_wmem_alloc by 1 when doing set_owner_w for the
    skb allocked in sctp_packet_transmit and decreases by 1 when freeing
    this skb.
    
    But when this skb goes through networking stack, some subcomponents
    might change skb->truesize and add the same amount on sk_wmem_alloc.
    However sctp doesn't know the amount to decrease by, it would cause
    a leak on sk->sk_wmem_alloc and the sock can never be freed.
    
    Xiumei found this issue when it hit esp_output_head() by using sctp
    over ipsec, where skb->truesize is added and so is sk->sk_wmem_alloc.
    
    Since sctp has used sk_wmem_queued to count for writable space since
    Commit cd305c74 ("sctp: use sk_wmem_queued to check for writable
    space"), it's ok to fix it by counting sk_wmem_alloc by skb truesize
    in sctp_packet_transmit.
    
    Fixes: cac2661c ("esp4: Avoid skb_cow_data whenever possible")
    Reported-by: default avatarXiumei Mu <xmu@redhat.com>
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    02968ccf
output.c 23.4 KB