ipv6: fix header length calculation in ip6_append_data()
Commit299b0767
(ipv6: Fix IPsec slowpath fragmentation problem) has introduced a error in the header length calculation that provokes corrupted packets when non-fragmentable extensions headers (Destination Option or Routing Header Type 2) are used. rt->rt6i_nfheader_len is the length of the non-fragmentable extension header, and it should be substracted to rt->dst.header_len, and not to exthdrlen, as it was done before commit299b0767
. This patch reverts to the original and correct behavior. It has been successfully tested with and without IPsec on packets that include non-fragmentable extensions headers. Signed-off-by: Romain Kuntz <r.kuntz@ipflavors.com> Acked-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3022551b6a
commit
7efdba5bd9
1 changed files with 2 additions and 2 deletions
|
@ -1213,10 +1213,10 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|||
if (dst_allfrag(rt->dst.path))
|
||||
cork->flags |= IPCORK_ALLFRAG;
|
||||
cork->length = 0;
|
||||
exthdrlen = (opt ? opt->opt_flen : 0) - rt->rt6i_nfheader_len;
|
||||
exthdrlen = (opt ? opt->opt_flen : 0);
|
||||
length += exthdrlen;
|
||||
transhdrlen += exthdrlen;
|
||||
dst_exthdrlen = rt->dst.header_len;
|
||||
dst_exthdrlen = rt->dst.header_len - rt->rt6i_nfheader_len;
|
||||
} else {
|
||||
rt = (struct rt6_info *)cork->dst;
|
||||
fl6 = &inet->cork.fl.u.ip6;
|
||||
|
|
Loading…
Reference in a new issue