New: MSG_ERRQUEUE messages do not pass to connected raw sockets
Subsystems (2)
A message that is not in the archive (sent off-list or not yet received): [email protected]/
(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).
Quoted 65 lines · On Thu, 10 Apr 2008 05:53:39 -0700 (PDT) [email protected] wrote:
http://bugzilla.kernel.org/show_bug.cgi?id=10437
Summary: MSG_ERRQUEUE messages do not pass to connected raw sockets Product: Networking Version: 2.5 KernelVersion: 2.6.24 Platform: All OS/Version: Linux Tree: Mainline Status: NEW Severity: high Priority: P1 Component: IPV6 AssignedTo: [email protected] ReportedBy: [email protected]There was a similar bug #8747 , but the fix is not somplete.
Problem Description:
It is related to the possibility to obtain
MSG_ERRQUEUEmessages from the udp and raw sockets, both connected and unconnected.There is a bug in
net/ipv6/icmp.ccode, which prevents such messages to be delivered to the errqueue of the correspond raw socket, when the socket is CONNECTED. The bug is related to wrong obtaining of the saddr/daddr pair, used to find the raw socket.Consider
__raw_v6_lookup()function fromnet/ipv6/raw.c. When a raw socket is looked up usual way, it is something like:sk =
__raw_v6_lookup(sk, nexthdr, daddr, saddr, IP6CB(skb)->iif);where "daddr" is a destination address of the incoming packet (IOW our local address), "saddr" is a source address of the incoming packet (the remote end).
But when the raw socket is looked up for some icmp error report, in net/ipv6/icmp.c:icmpv6_notify() , daddr/saddr must be obtained from the echoed fragment of the "bad" packet, not from the ipv6 header of the icmp packet itself.
Consider:
ipv6_header--icmp_header--echoed_ipv6_header--at_least_8_bytes...Now saddr/daddr, used for
__raw_v6_lookup, are from the first "ipv6_header", but must be from the "echoed_ipv6_header" .In the previous bug #8747, I assumed that the issue is just a typo, by switching saddr/daddr in agrument list. Unfortunately, it appears that the pair is even obtained from the wrong place...
Steps to reproduce:
Create some raw socket, connect it to an address, and cause some error
situation: f.e. set ttl=1 where the remote address is more than 1 hop to reach. SetIPV6_RECVERR.
Then send something and wait for the error (f.e.poll()with POLLERR|POLLIN). You should receive "time exceeded" icmp message (because of "ttl=1"), but the socket do not receive it.
Quoted 4 lines
If you do not connect your raw socket, you will receive
MSG_ERRQUEUEsuccessfully. (The reason is that for unconnected socket there are no actual checks for local/remote addresses).
(There's more info, and a patch at the above link).
Dmitry, I'd suggest that you send the patch via email to [email protected] and to YOSHIFUJI Hideaki <[email protected]>.
PATCH 1/1 : bug 10437: MSG_ERRQUEUE messages do not pass to connected raw sockets
Quoted 2 lines · Andrew Morton
Dmitry, I'd suggest that you send the patch via email to [email protected]
OK, resend
Quoted 2 lines
and to YOSHIFUJI Hideaki <[email protected]>.
It seems that I cannot reach this e-mail address from my country :( (some terrible antispam?)
The small patch to fix bug #10437 .
See description of the bug at http://bugzilla.kernel.org/show_bug.cgi?id=10437
Dmitry Butskoy
http://www.fedoraproject.org/wiki/DmitryButskoy
Re: [PATCH] [IPV6]: bug 10437: MSG_ERRQUEUE messages do not pass to connected raw sockets
In article <[email protected]> (at Fri, 11 Apr 2008 15:02:52 +0400), Dmitry Butskoy <[email protected]> says:
Quoted 8 lines
Quoted 2 lines · Andrew Morton
Dmitry, I'd suggest that you send the patch via email to [email protected]
OK, resend
Quoted 2 lines
and to YOSHIFUJI Hideaki <[email protected]>.
Quoted 8 lines
It seems that I cannot reach this e-mail address from my country :( (some terrible antispam?)
The small patch to fix bug #10437 .
See description of the bug at
http://bugzilla.kernel.org/show_bug.cgi?id=10437
I'm going to agree.
Your patch is for 2.6.24-stable
Can you provide patches for linux-2.6.25-rc, please?
Thanks.
--yoshfuji
Re: [PATCH] [IPV6]: bug 10437: MSG_ERRQUEUE messages do not pass to connected raw sockets
Quoted 20 lines · YOSHIFUJI Hideaki / 吉藤英明
In article <[email protected]> (at Fri, 11 Apr 2008 15:02:52 +0400), Dmitry Butskoy <[email protected]> says:
Quoted 17 lines
Quoted 3 lines · Andrew Morton
Dmitry, I'd suggest that you send the patch via email to [email protected]
OK, resend
Quoted 3 lines
and to YOSHIFUJI Hideaki <[email protected]>.
It seems that I cannot reach this e-mail address from my country :( (some terrible antispam?)
The small patch to fix bug #10437 .
Quoted 8 lines
Quoted 2 lines
See description of the bug at http://bugzilla.kernel.org/show_bug.cgi?id=10437
I'm going to agree.
Your patch is for 2.6.24-stable
Can you provide patches for linux-2.6.25-rc, please?
Attached.
Could it be fixed for, say 2.6.24.5, as well?
If it is possible, please, report me at what next stable kernel version it will appear to be fixed...
~buc
raw.c +2 -2
@@ -372,8 +372,8 @@read_lock (&raw_v6_hashinfo.lock); sk =sk_head (&raw_v6_hashinfo.ht[hash]); if (sk != NULL) { - saddr = &ipv6_hdr(skb)->saddr; - daddr = &ipv6_hdr(skb)->daddr; + saddr = &((struct ipv6hdr *)skb->data)->saddr; + daddr = &((struct ipv6hdr *)skb->data)->daddr; net = skb->dev->nd_net; while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr,
David Miller
maintainerFrom: Andrew Morton <[email protected]>
Date: Thu, 10 Apr 2008 10:34:44 -0700
Quoted 2 lines
Dmitry, I'd suggest that you send the patch via email to [email protected] and to YOSHIFUJI Hideaki <[email protected]>.
This person is having trouble emailing things to the lists and elsewhere, for whatever reason, and he states this in the bugzilla entry so asking him to email a patch somewhere isn't going to help.
The code in this area has changed a bit, here is the patch I just checked into net-2.6 and which I'll push to Linus for 2.6.25 and will also submit for the 2.6.24-stable branch.
commit b45e9189c058bfa495073951ff461ee0eea968be
Author: David S. Miller <[email protected]> Date: Sun Apr 13 23:14:15 2008 -0700
[IPV6]: Fix ipv6 address fetching in raw6_icmp_error().
Fixes kernel bugzilla 10437
Based almost entirely upon a patch by Dmitry Butskoy.
When deciding what raw sockets to deliver the ICMPv6 to, we should use the addresses in the ICMPv6 quoted IPV6 header, not the top-level one.
net/ipv6/raw.c +4 -2
@@ -372,8 +372,10 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr,read_lock (&raw_v6_hashinfo.lock); sk =sk_head (&raw_v6_hashinfo.ht[hash]); if (sk != NULL) { - saddr = &ipv6_hdr(skb)->saddr; - daddr = &ipv6_hdr(skb)->daddr; + struct ipv6hdr *hdr = (struct ipv6hdr *) skb->data; + + saddr = &hdr->saddr; + daddr = &hdr->daddr; net = skb->dev->nd_net; while ((sk = __raw_v6_lookup(net, sk, nexthdr, saddr, daddr,