From: Sage Weil Date: Thu, 8 Dec 2016 00:25:55 +0000 (-0600) Subject: msg/simple/Pipe: avoid returning 0 on poll timeout X-Git-Tag: v11.1.0~26^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6c3d015c6854a12cda40673848813d968ff6afae;p=ceph-ci.git msg/simple/Pipe: avoid returning 0 on poll timeout If poll times out it will return 0 (no data to read on socket). In 165e5abdbf6311974d4001e43982b83d06f9e0cc we changed tcp_read_wait from returning -1 to returning -errno, which means we return 0 instead of -1 in this case. This makes tcp_read() get into an infinite loop by repeatedly trying to read from the socket and getting EAGAIN. Fix by explicitly checking for a 0 return from poll(2) and returning EAGAIN in that case. Fixes: http://tracker.ceph.com/issues/18184 Signed-off-by: Sage Weil --- diff --git a/src/msg/simple/Pipe.cc b/src/msg/simple/Pipe.cc index a7c43857787..9233b5f6b66 100644 --- a/src/msg/simple/Pipe.cc +++ b/src/msg/simple/Pipe.cc @@ -2583,8 +2583,11 @@ int Pipe::tcp_read_wait() if (has_pending_data()) return 0; - if (poll(&pfd, 1, msgr->timeout) <= 0) + int r = poll(&pfd, 1, msgr->timeout); + if (r < 0) return -errno; + if (r == 0) + return -EAGAIN; evmask = POLLERR | POLLHUP | POLLNVAL; #if defined(__linux__)