lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CABrhC0=TgBwdW1SaDgZRaYWYpqKvTY-c96JfGdMpSD0-e1+YKw@mail.gmail.com>
Date:	Mon, 29 Jul 2013 15:00:11 -0400
From:	John Heffner <johnwheffner@...il.com>
To:	"Artem S. Tashkinov" <t.artem@...os.com>
Cc:	Eric Dumazet <eric.dumazet@...il.com>, stephen@...workplumber.org,
	LKML <linux-kernel@...r.kernel.org>,
	Netdev <netdev@...r.kernel.org>
Subject: Re: A call to revise sockets behaviour

On Mon, Jul 29, 2013 at 2:02 PM, Artem S. Tashkinov <t.artem@...os.com> wrote:
> Jul 29, 2013 11:43:00 PM, Eric wrote:
> On Mon, 2013-07-29 at 15:47 +0000, Artem S. Tashkinov wrote:
>>
>>> A wine developer clearly showed that this option simply doesn't work.
>>>
>>> http://bugs.winehq.org/show_bug.cgi?id=26031#c21
>>>
>>> Output of strace:
>>> getsockopt(24, SOL_SOCKET, SO_REUSEADDR, [0], [4]) = 0
>>> setsockopt(24, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
>>> bind(24, {sa_family=AF_INET, sin_port=htons(43012), sin_addr=inet_addr("0.
>>> 0.0.0")}, 16) = -1 EADDRINUSE (Address already in use)
>>
>>Its clear that some other socket did not use SO_REUSADDR
>>
>>All sockets using a given port _must_ have use SO_REUSADDR to allow this
>>port being reused.
>>
>
> It's exactly what's been tried. A program running with SO_REUSADDR, once no longer
> running consequently fails to regain the rights for the port.

To reiterate what Eric said, it seems likely that the listen socket on
which the currently-open sockets were created did not have
SO_REUSEADDR set.  If you follow the sequence:

a = socket()
bind(a, 0.0.0.0, P)
listen(a)
accept(a)
close(a)

b = socket()
setsockopt(b, SOL_SOCKET, SO_REUSEADDR, 1)
bind(b, 0.0.0.0, P)

this last bind() will fail.  If you insert setsocket(a, SOL_SOCKET,
SO_REUSEADDR, 1) before the first bind, (assuming all existing sockets
on port P have timed out and entered the CLOSED state), this program
will succeed.

Put another way, when creating a listen socket, the creator has
control over whether it's willing to allow any address reuse.  This is
strict -- if any existing connections exist, its bind will fail, and
if any of its future connections exist, binds at that time will fail
(regardless of whether that future socket has SO_REUSEADDR set).

  -John
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ