| 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() {
|
|
|