From: Alex Rousskov Date: Thu, 30 Jun 2016 20:51:54 +0000 (+1200) Subject: Do not make bogus recvmsg(2) calls when closing UDS sockets. X-Git-Tag: SQUID_3_5_20~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8968cc9521884399470ba8742ac7da7eb59d8548;p=thirdparty%2Fsquid.git Do not make bogus recvmsg(2) calls when closing UDS sockets. comm_empty_os_read_buffers() assumes that all non-blocking FD_READ_METHODs can read into an opaque buffer filled with random characters. That assumption is wrong for UDS sockets that require an initialized msghdr structure. Feeding random data to recvmsg(2) leads to confusing errors, at best. Squid does not log those errors, but they are visible in, for example, strace: recvmsg(17, 0x7fffbb, MSG_DONTWAIT) = -1 EMSGSIZE (Message too long) comm_empty_os_read_buffers() is meant to prevent TCP RST packets. The function now ignores UDS sockets that are not used for TCP. TODO: Useless reads may also exist for UDP and some TCP sockets. --- diff --git a/src/comm.cc b/src/comm.cc index f0f78ff320..1b8bbb39fe 100644 --- a/src/comm.cc +++ b/src/comm.cc @@ -110,7 +110,7 @@ comm_empty_os_read_buffers(int fd) /* prevent those nasty RST packets */ char buf[SQUID_TCP_SO_RCVBUF]; - if (fd_table[fd].flags.nonblocking) { + if (fd_table[fd].flags.nonblocking && fd_table[fd].type != FD_MSGHDR) { while (FD_READ_METHOD(fd, buf, SQUID_TCP_SO_RCVBUF) > 0) {}; } #endif