Re: [PATCH v2,net-next 1/2] ip_gre: fix parsing gre header in ipgre_err
From: Haishuang Yan <hidden>
Date: 2018-09-14 02:10:06
Also in:
lkml
On 2018年9月14日, at 上午1:58, David Miller [off-list ref] wrote: From: Haishuang Yan <redacted> Date: Wed, 12 Sep 2018 17:21:21 +0800quoted
@@ -86,7 +86,7 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi,options = (__be32 *)(greh + 1); if (greh->flags & GRE_CSUM) { - if (skb_checksum_simple_validate(skb)) { + if (csum_err && skb_checksum_simple_validate(skb)) { *csum_err = true; return -EINVAL; }You want to ignore csum errors, but you do not want to elide the side effects of the skb_checksum_simple_validate() call which are to set skb->csum_valid and skb->csum. Therefore, the skb_checksum_simple_validate() call still needs to be performed. We just wont return -EINVAL in the NULL csum_err case.
How about doing like this:
--- a/net/ipv4/gre_demux.c
+++ b/net/ipv4/gre_demux.c@@ -86,13 +86,14 @@ int gre_parse_header(struct sk_buff *skb, struct tnl_ptk_info *tpi, options = (__be32 *)(greh + 1); if (greh->flags & GRE_CSUM) { - if (skb_checksum_simple_validate(skb)) { + if (!skb_checksum_simple_validate(skb)) { + skb_checksum_try_convert(skb, IPPROTO_GRE, 0, + null_compute_pseudo); + } else if (csum_err) { *csum_err = true; return -EINVAL; } - skb_checksum_try_convert(skb, IPPROTO_GRE, 0, - null_compute_pseudo);
Thanks for reviewing.