Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.os.linux.development.apps > #669
| From | Rainer Weikusat <rweikusat@mobileactivedefense.com> |
|---|---|
| Newsgroups | comp.os.linux.development.apps |
| Subject | Re: Linux O_NONBLOCK bug/ quirk |
| Date | 2014-03-28 20:12 +0000 |
| Message-ID | <87siq23wwg.fsf@sable.mobileactivedefense.com> (permalink) |
| References | <878urvu0gx.fsf@sable.mobileactivedefense.com> |
Rainer Weikusat <rweikusat@mobileactivedefense.com> writes:
[...]
> a receive operation on a socket in
> non-blocking mode can actually be blocked forever on Linux, example
> code:
>
> ---------
> #include <fcntl.h>
> #include <string.h>
> #include <sys/socket.h>
> #include <sys/un.h>
>
> int main(void)
> {
> struct sockaddr_un sun;
> int fd;
>
> fd = socket(AF_UNIX, SOCK_DGRAM, 0);
> sun.sun_family = AF_UNIX;
> strncpy(sun.sun_path, "/tmp/bla", sizeof(sun.sun_path));
> bind(fd, (struct sockaddr *)&sun, sizeof(sun));
>
> if (fork() == 0) read(fd, &fd, sizeof(fd));
>
> sleep(1);
>
> fcntl(fd, F_SETFL, O_NONBLOCK);
> read(fd, &fd, sizeof(fd));
>
> return 0;
> }
> --------
This is more serious than I thought. Considering newer APIs, the can
also be
------------
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
int main(void)
{
struct sockaddr_un sun;
int fd;
fd = socket(AF_UNIX, SOCK_DGRAM, 0);
sun.sun_family = AF_UNIX;
strncpy(sun.sun_path, "/tmp/bla", sizeof(sun.sun_path));
bind(fd, (struct sockaddr *)&sun, sizeof(sun));
if (fork() == 0) recv(fd, &fd, sizeof(fd), 0);
sleep(1);
recv(fd, &fd, sizeof(fd), MSG_DONTWAIT);
return 0;
}
-------------
What happens here is that the 2nd recv stops on a mutex held by the
first and thus, effectively blocks until a message is received on this
socket, IOW, the implementation of MSG_DONTWAIT is completely broken for
datagram sockets (certainly AF_UNIX, likely, AF_INET, too). Further, it
is not going to be fixed because the so-called 'networking maintainer'
'completely disagrees' with the idea that 'non-blocking operation'
actually means 'the call will not block' (that's the state of 2 days
ago).
Back to comp.os.linux.development.apps | Previous | Next — Previous in thread | Next in thread | Find similar
Linux O_NONBLOCK bug/ quirk Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2014-03-27 15:26 +0000
Re: Linux O_NONBLOCK bug/ quirk crankypuss <crankypuss@nomail.invalid> - 2014-03-28 02:08 -0600
Re: Linux O_NONBLOCK bug/ quirk Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2014-03-28 12:45 +0000
Re: Linux O_NONBLOCK bug/ quirk crankypuss <crankypuss@nomail.invalid> - 2014-03-29 05:19 -0600
Re: Linux O_NONBLOCK bug/ quirk Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2014-03-28 20:12 +0000
Re: Linux O_NONBLOCK bug/ quirk unixb4coffee <unixb4coffee@gmail.com> - 2014-04-02 11:13 -0700
Re: Linux O_NONBLOCK bug/ quirk Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2014-04-03 16:36 +0100
Re: Linux O_NONBLOCK bug/ quirk unixb4coffee <unixb4coffee@gmail.com> - 2014-04-03 11:43 -0700
Re: Linux O_NONBLOCK bug/ quirk Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2014-04-03 21:31 +0100
Re: Linux O_NONBLOCK bug/ quirk Lusotec <nomail@nomail.not> - 2014-03-28 23:13 +0000
Re: Linux O_NONBLOCK bug/ quirk Richard Kettlewell <rjk@greenend.org.uk> - 2014-03-29 11:15 +0000
Re: Linux O_NONBLOCK bug/ quirk Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2014-03-30 19:42 +0100
Re: Linux O_NONBLOCK bug/ quirk Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2014-04-16 12:42 +0100
Re: Linux O_NONBLOCK bug/ quirk Rainer Weikusat <rweikusat@mobileactivedefense.com> - 2014-04-16 13:36 +0100
csiph-web