Index: net/socket/socket_libevent.cc |
diff --git a/net/socket/socket_libevent.cc b/net/socket/socket_libevent.cc |
index 5f16c929ab202fd4c61ba4ed5070cb523fb0353d..001b8fb6f3595fc9e05415ad2aedb10f4486a3bf 100644 |
--- a/net/socket/socket_libevent.cc |
+++ b/net/socket/socket_libevent.cc |
@@ -418,7 +418,20 @@ void SocketLibevent::ConnectCompleted() { |
int SocketLibevent::DoRead(IOBuffer* buf, int buf_len) { |
int rv = HANDLE_EINTR(read(socket_fd_, buf->data(), buf_len)); |
- return rv >= 0 ? rv : MapSystemError(errno); |
+ if (rv >= 0) { |
+ return rv; |
+ } else if (errno != EAGAIN) { |
+ return MapSystemError(errno); |
+ } |
+ |
+ // The socket may have OOB data waiting, and libevent does not distinguish |
+ // between ready inline and out-of-band data when it activates the |
+ // callback. See if there is OOB data available. |
+ rv = HANDLE_EINTR(recv(socket_fd_, buf->data(), buf_len, MSG_OOB)); |
+ if (rv >= 0) { |
+ return ERR_OOB_DATA; |
+ } |
+ return ERR_IO_PENDING; |
} |
void SocketLibevent::ReadCompleted() { |