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 for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Sat, 18 Jun 2011 19:43:05 +0200
From:	Eric Dumazet <eric.dumazet@...il.com>
To:	Nemo Publius <nemo@...f-evident.org>
Cc:	linux-kernel@...r.kernel.org
Subject: Re: Does Linux select() violate POSIX?

Le samedi 18 juin 2011 à 10:06 -0700, Nemo Publius a écrit :
> Suppose I  have a file descriptor referencing a TCP/IP socket in blocking mode.
> 
> Suppose select() reports that the descriptor is ready for reading.
> 
> If I then call recv() on that descriptor, can it _ever_ block?
> 
> 
> According to the Linux select man page
> (http://linux.die.net/man/2/select), the answer is yes:
> 
> "Under Linux, select() may report a socket file descriptor as "ready
> for reading", while nevertheless a subsequent read blocks. This could
> for example happen when data has arrived but upon examination has
> wrong checksum and is discarded. There may be other circumstances in
> which a file descriptor is spuriously reported as ready."
> 

Only UDP can currently do that, not TCP, if NIC did not already verified
the checksum.

So the answer to your question is no.

> 
> According to the POSIX specification for select
> (http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html),
> the answer is no:
> 
> "A descriptor shall be considered ready for reading when a call to an
> input function with O_NONBLOCK clear would not block, whether or not
> the function would transfer data successfully. (The function might
> return data, an end-of-file indication, or an error other than one
> indicating that it is blocked, and in each of these cases the
> descriptor shall be considered ready for reading.)"
> 
> 
> There are only three possibilities:
> 
> 1) I am mis-reading the POSIX spec.
> 2) The Linux select() man page is wrong.
> 3) Linux select() violates the POSIX spec.

We dont care, since every sane application using select() should also
use socket in non blocking mode.

Between time select()/poll() says 'OK you can go', and time you enter
kernel, conditions might have changed. For example, maybe kernel memory
is not available and a send() would _block_, even if socket queue is
empty.



--
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