| From foo@baz Thu Mar 28 21:57:57 CET 2019 |
| From: Xin Long <lucien.xin@gmail.com> |
| Date: Mon, 18 Mar 2019 19:47:00 +0800 |
| Subject: sctp: get sctphdr by offset in sctp_compute_cksum |
| |
| From: Xin Long <lucien.xin@gmail.com> |
| |
| [ Upstream commit 273160ffc6b993c7c91627f5a84799c66dfe4dee ] |
| |
| sctp_hdr(skb) only works when skb->transport_header is set properly. |
| |
| But in Netfilter, skb->transport_header for ipv6 is not guaranteed |
| to be right value for sctphdr. It would cause to fail to check the |
| checksum for sctp packets. |
| |
| So fix it by using offset, which is always right in all places. |
| |
| v1->v2: |
| - Fix the changelog. |
| |
| Fixes: e6d8b64b34aa ("net: sctp: fix and consolidate SCTP checksumming code") |
| Reported-by: Li Shuang <shuali@redhat.com> |
| Signed-off-by: Xin Long <lucien.xin@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| include/net/sctp/checksum.h | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/include/net/sctp/checksum.h |
| +++ b/include/net/sctp/checksum.h |
| @@ -60,7 +60,7 @@ static inline __wsum sctp_csum_combine(_ |
| static inline __le32 sctp_compute_cksum(const struct sk_buff *skb, |
| unsigned int offset) |
| { |
| - struct sctphdr *sh = sctp_hdr(skb); |
| + struct sctphdr *sh = (struct sctphdr *)(skb->data + offset); |
| __le32 ret, old = sh->checksum; |
| const struct skb_checksum_ops ops = { |
| .update = sctp_csum_update, |