Package: hurd Version: 1:0.8.git20160522-4 Severity: normal Tags: patch upstream
Dear Maintainer, send/sendto/sendmsg/recv/recvfrom/recvmsg in combination with PF_LOCAL sockets don't honor MSG_DONTWAIT. If specified, the operation will block anyway. This is really bad if one has code that relies on the fact that a recv* returns EAGAIN once all data has been read. I've reported this to the debian-hurd and bug-hurd mailing lists, and also provided a reproducer for this issue: https://lists.gnu.org/archive/html/bug-hurd/2016-08/msg00000.html https://lists.debian.org/debian-hurd/2016/08/msg00000.html I've investigated further and found the culprit in hurd's pflocal/socket.c. I've attached a patch that fixes the issue for me. I've also sent the patch to both mailing lists: https://lists.gnu.org/archive/html/bug-hurd/2016-08/msg00011.html https://lists.debian.org/debian-hurd/2016/08/msg00008.html Regards, Christian -- System Information: Debian Release: stretch/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: hurd-i386 (i686-AT386) Kernel: GNU-Mach 1.7+git20160607-486/Hurd-0.8 Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) (ignored: LC_ALL set to C.UTF-8) Shell: /bin/sh linked to /bin/dash Init: sysvinit (via /sbin/init) Versions of packages hurd depends on: ii hurd-libs0.3 1:0.8.git20160522-4+b1 ii libblkid1 2.28-6 ii libbz2-1.0 1.0.6-8 ii libc0.3 2.23-4 ii libdaemon0 0.14-6 ii libncursesw5 6.0+20160625-1+b1 ii libtinfo5 6.0+20160625-1+b1 ii libx11-6 2:1.6.3-1 ii netdde 0.0.20150828-3 ii sysv-rc 2.88dsf-59.8 ii xkb-data 2.17-1 ii zlib1g 1:1.2.8.dfsg-2 Versions of packages hurd recommends: ii bf-utf-source 0.07 Versions of packages hurd suggests: pn hurd-doc <none> -- Configuration Files: /etc/default/hurd-console changed [not included] -- no debconf information
Description: Support MSG_DONTWAIT in pflocal send/recv Author: Christian Seiler <christ...@iwakd.de> Bug: https://lists.gnu.org/archive/html/bug-hurd/2016-08/msg00000.html Last-Update: 2016-08-05 --- This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ --- a/pflocal/socket.c +++ b/pflocal/socket.c @@ -282,6 +282,7 @@ S_socket_send (struct sock_user *user, s size_t *amount) { error_t err = 0; + int noblock; struct pipe *pipe; struct sock *sock, *dest_sock; struct addr *source_addr; @@ -333,8 +334,9 @@ S_socket_send (struct sock_user *user, s if (!err) { - err = pipe_send (pipe, sock->flags & PFLOCAL_SOCK_NONBLOCK, - source_addr, data, data_len, + noblock = (user->sock->flags & PFLOCAL_SOCK_NONBLOCK) + || (flags & MSG_DONTWAIT); + err = pipe_send (pipe, noblock, source_addr, data, data_len, control, control_len, ports, num_ports, amount); if (dest_sock) @@ -373,6 +375,7 @@ S_socket_recv (struct sock_user *user, { error_t err; unsigned flags; + int noblock; struct pipe *pipe; void *source_addr = NULL; @@ -398,10 +401,11 @@ S_socket_recv (struct sock_user *user, } else if (!err) { + noblock = (user->sock->flags & PFLOCAL_SOCK_NONBLOCK) + || (in_flags & MSG_DONTWAIT); err = - pipe_recv (pipe, user->sock->flags & PFLOCAL_SOCK_NONBLOCK, &flags, - &source_addr, data, data_len, amount, - control, control_len, ports, num_ports); + pipe_recv (pipe, noblock, &flags, &source_addr, data, data_len, + amount, control, control_len, ports, num_ports); pipe_release_reader (pipe); }