[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAM_iQpVVBfwd7P0-dY08Bw7QNr_w77va4AEMFj5xMuOddQoq2g@mail.gmail.com>
Date: Fri, 24 Mar 2017 15:34:51 -0700
From: Cong Wang <xiyou.wangcong@...il.com>
To: Eric Dumazet <eric.dumazet@...il.com>
Cc: Daurnimator <quae@...rnimator.com>,
Linux Kernel Network Developers <netdev@...r.kernel.org>,
William Ahern <william@...handclement.com>,
"Santi T." <santitm99@...il.com>, mtk.manpages@...il.com
Subject: Re: EINVAL when using connect() for udp sockets
(Cc'ing Michael Kerrisk)
On Wed, Mar 22, 2017 at 10:18 PM, Eric Dumazet <eric.dumazet@...il.com> wrote:
> On Thu, 2017-03-23 at 13:22 +1100, Daurnimator wrote:
>> On 9 March 2017 at 14:10, Daurnimator <quae@...rnimator.com> wrote:
>> > When debugging https://github.com/daurnimator/lua-http/issues/73 which
>> > uses https://github.com/wahern/dns we ran into an issue where modern
>> > linux kernels return EINVAL if you try and re-use a udp socket.
>> > The issue seems to occur if you go from a local destination ip to a
>> > non-local one.
>>
>> Did anyone get a chance to look into this issue?
>
> I believe man page is not complete.
>
> A disconnect is needed before another connect()
Is it? Making connect() reentrant is reasonable for connection-less
protocol like UDP, but I don't dig POSIX for the details. If so we need
something like below...
--- a/net/ipv4/datagram.c
+++ b/net/ipv4/datagram.c
@@ -40,7 +40,7 @@ int __ip4_datagram_connect(struct sock *sk, struct
sockaddr *uaddr, int addr_len
sk_dst_reset(sk);
oif = sk->sk_bound_dev_if;
- saddr = inet->inet_saddr;
+ saddr = inet->inet_saddr = 0;
if (ipv4_is_multicast(usin->sin_addr.s_addr)) {
if (!oif)
oif = inet->mc_index;
Powered by blists - more mailing lists