mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-11-20 21:54:37 +00:00
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…
Add table
Reference in a new issue