| Index: net/socket/tcp_socket_win.cc
|
| diff --git a/net/socket/tcp_socket_win.cc b/net/socket/tcp_socket_win.cc
|
| index d879a5ee95e7fdf62b22ee4f3ff17d545396db0b..6bb5895eff18ff698f36b3ce3eed80cabdd400ed 100644
|
| --- a/net/socket/tcp_socket_win.cc
|
| +++ b/net/socket/tcp_socket_win.cc
|
| @@ -40,7 +40,8 @@ const int kTCPKeepAliveSeconds = 45;
|
| int SetSocketReceiveBufferSize(SOCKET socket, int32_t size) {
|
| int rv = setsockopt(socket, SOL_SOCKET, SO_RCVBUF,
|
| reinterpret_cast<const char*>(&size), sizeof(size));
|
| - int net_error = (rv == 0) ? OK : MapSystemError(WSAGetLastError());
|
| + int os_error = WSAGetLastError();
|
| + int net_error = (rv == 0) ? OK : MapSystemError(os_error);
|
| DCHECK(!rv) << "Could not set socket receive buffer size: " << net_error;
|
| return net_error;
|
| }
|
| @@ -48,7 +49,8 @@ int SetSocketReceiveBufferSize(SOCKET socket, int32_t size) {
|
| int SetSocketSendBufferSize(SOCKET socket, int32_t size) {
|
| int rv = setsockopt(socket, SOL_SOCKET, SO_SNDBUF,
|
| reinterpret_cast<const char*>(&size), sizeof(size));
|
| - int net_error = (rv == 0) ? OK : MapSystemError(WSAGetLastError());
|
| + int os_error = WSAGetLastError();
|
| + int net_error = (rv == 0) ? OK : MapSystemError(os_error);
|
| DCHECK(!rv) << "Could not set socket send buffer size: " << net_error;
|
| return net_error;
|
| }
|
| @@ -67,8 +69,9 @@ bool SetTCPKeepAlive(SOCKET socket, BOOL enable, int delay_secs) {
|
| int rv = WSAIoctl(socket, SIO_KEEPALIVE_VALS, &keepalive_vals,
|
| sizeof(keepalive_vals), NULL, 0,
|
| &bytes_returned, NULL, NULL);
|
| + int os_error = WSAGetLastError();
|
| DCHECK(!rv) << "Could not enable TCP Keep-Alive for socket: " << socket
|
| - << " [error: " << WSAGetLastError() << "].";
|
| + << " [error: " << os_error << "].";
|
|
|
| // Disregard any failure in disabling nagle or enabling TCP Keep-Alive.
|
| return rv == 0;
|
| @@ -98,6 +101,13 @@ int MapConnectError(int os_error) {
|
| }
|
| }
|
|
|
| +bool SetNonBlockingAndGetError(int fd, int* os_error) {
|
| + bool ret = base::SetNonBlocking(fd);
|
| + *os_error = WSAGetLastError();
|
| +
|
| + return ret;
|
| +}
|
| +
|
| } // namespace
|
|
|
| //-----------------------------------------------------------------------------
|
| @@ -276,13 +286,14 @@ int TCPSocketWin::Open(AddressFamily family) {
|
|
|
| socket_ = CreatePlatformSocket(ConvertAddressFamily(family), SOCK_STREAM,
|
| IPPROTO_TCP);
|
| + int os_error = WSAGetLastError();
|
| if (socket_ == INVALID_SOCKET) {
|
| PLOG(ERROR) << "CreatePlatformSocket() returned an error";
|
| - return MapSystemError(WSAGetLastError());
|
| + return MapSystemError(os_error);
|
| }
|
|
|
| - if (!base::SetNonBlocking(socket_)) {
|
| - int result = MapSystemError(WSAGetLastError());
|
| + if (!SetNonBlockingAndGetError(socket_, &os_error)) {
|
| + int result = MapSystemError(os_error);
|
| Close();
|
| return result;
|
| }
|
| @@ -298,8 +309,9 @@ int TCPSocketWin::AdoptConnectedSocket(SOCKET socket,
|
|
|
| socket_ = socket;
|
|
|
| - if (!base::SetNonBlocking(socket_)) {
|
| - int result = MapSystemError(WSAGetLastError());
|
| + int os_error;
|
| + if (!SetNonBlockingAndGetError(socket_, &os_error)) {
|
| + int result = MapSystemError(os_error);
|
| Close();
|
| return result;
|
| }
|
| @@ -316,8 +328,9 @@ int TCPSocketWin::AdoptListenSocket(SOCKET socket) {
|
|
|
| socket_ = socket;
|
|
|
| - if (!base::SetNonBlocking(socket_)) {
|
| - int result = MapSystemError(WSAGetLastError());
|
| + int os_error;
|
| + if (!SetNonBlockingAndGetError(socket_, &os_error)) {
|
| + int result = MapSystemError(os_error);
|
| Close();
|
| return result;
|
| }
|
| @@ -337,9 +350,10 @@ int TCPSocketWin::Bind(const IPEndPoint& address) {
|
| return ERR_ADDRESS_INVALID;
|
|
|
| int result = bind(socket_, storage.addr, storage.addr_len);
|
| + int os_error = WSAGetLastError();
|
| if (result < 0) {
|
| PLOG(ERROR) << "bind() returned an error";
|
| - return MapSystemError(WSAGetLastError());
|
| + return MapSystemError(os_error);
|
| }
|
|
|
| return OK;
|
| @@ -352,15 +366,17 @@ int TCPSocketWin::Listen(int backlog) {
|
| DCHECK_EQ(accept_event_, WSA_INVALID_EVENT);
|
|
|
| accept_event_ = WSACreateEvent();
|
| + int os_error = WSAGetLastError();
|
| if (accept_event_ == WSA_INVALID_EVENT) {
|
| PLOG(ERROR) << "WSACreateEvent()";
|
| - return MapSystemError(WSAGetLastError());
|
| + return MapSystemError(os_error);
|
| }
|
|
|
| int result = listen(socket_, backlog);
|
| + os_error = WSAGetLastError();
|
| if (result < 0) {
|
| PLOG(ERROR) << "listen() returned an error";
|
| - return MapSystemError(WSAGetLastError());
|
| + return MapSystemError(os_error);
|
| }
|
|
|
| return OK;
|
| @@ -438,9 +454,10 @@ bool TCPSocketWin::IsConnected() const {
|
| // Check if connection is alive.
|
| char c;
|
| int rv = recv(socket_, &c, 1, MSG_PEEK);
|
| + int os_error = WSAGetLastError();
|
| if (rv == 0)
|
| return false;
|
| - if (rv == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
|
| + if (rv == SOCKET_ERROR && os_error != WSAEWOULDBLOCK)
|
| return false;
|
|
|
| return true;
|
| @@ -459,9 +476,10 @@ bool TCPSocketWin::IsConnectedAndIdle() const {
|
| // unexpectedly.
|
| char c;
|
| int rv = recv(socket_, &c, 1, MSG_PEEK);
|
| + int os_error = WSAGetLastError();
|
| if (rv >= 0)
|
| return false;
|
| - if (WSAGetLastError() != WSAEWOULDBLOCK)
|
| + if (os_error != WSAEWOULDBLOCK)
|
| return false;
|
|
|
| return true;
|
| @@ -498,6 +516,7 @@ int TCPSocketWin::Write(IOBuffer* buf,
|
| DWORD num;
|
| int rv = WSASend(socket_, &write_buffer, 1, &num, 0,
|
| &core_->write_overlapped_, NULL);
|
| + int os_error = WSAGetLastError();
|
| if (rv == 0) {
|
| if (ResetEventIfSignaled(core_->write_overlapped_.hEvent)) {
|
| rv = static_cast<int>(num);
|
| @@ -514,7 +533,6 @@ int TCPSocketWin::Write(IOBuffer* buf,
|
| return rv;
|
| }
|
| } else {
|
| - int os_error = WSAGetLastError();
|
| if (os_error != WSA_IO_PENDING) {
|
| int net_error = MapSystemError(os_error);
|
| net_log_.AddEvent(NetLogEventType::SOCKET_WRITE_ERROR,
|
| @@ -535,8 +553,10 @@ int TCPSocketWin::GetLocalAddress(IPEndPoint* address) const {
|
| DCHECK(address);
|
|
|
| SockaddrStorage storage;
|
| - if (getsockname(socket_, storage.addr, &storage.addr_len))
|
| - return MapSystemError(WSAGetLastError());
|
| + if (getsockname(socket_, storage.addr, &storage.addr_len)) {
|
| + int os_error = WSAGetLastError();
|
| + return MapSystemError(os_error);
|
| + }
|
| if (!address->FromSockAddr(storage.addr, storage.addr_len))
|
| return ERR_ADDRESS_INVALID;
|
|
|
| @@ -689,8 +709,9 @@ int TCPSocketWin::AcceptInternal(std::unique_ptr<TCPSocketWin>* socket,
|
| IPEndPoint* address) {
|
| SockaddrStorage storage;
|
| int new_socket = accept(socket_, storage.addr, &storage.addr_len);
|
| + int os_error = WSAGetLastError();
|
| if (new_socket < 0) {
|
| - int net_error = MapSystemError(WSAGetLastError());
|
| + int net_error = MapSystemError(os_error);
|
| if (net_error != ERR_IO_PENDING)
|
| net_log_.EndEventWithNetErrorCode(NetLogEventType::TCP_ACCEPT, net_error);
|
| return net_error;
|
| @@ -763,11 +784,13 @@ int TCPSocketWin::DoConnect() {
|
| return ERR_ADDRESS_INVALID;
|
|
|
| int result;
|
| + int os_error;
|
| {
|
| // TODO(ricea): Remove ScopedTracker below once crbug.com/436634 is fixed.
|
| tracked_objects::ScopedTracker tracking_profile(
|
| FROM_HERE_WITH_EXPLICIT_FUNCTION("436634 connect()"));
|
| result = connect(socket_, storage.addr, storage.addr_len);
|
| + os_error = WSAGetLastError();
|
| }
|
|
|
| if (!result) {
|
| @@ -786,7 +809,6 @@ int TCPSocketWin::DoConnect() {
|
| if (ResetEventIfSignaled(core_->read_overlapped_.hEvent))
|
| return OK;
|
| } else {
|
| - int os_error = WSAGetLastError();
|
| if (os_error != WSAEWOULDBLOCK) {
|
| LOG(ERROR) << "connect failed: " << os_error;
|
| connect_os_error_ = os_error;
|
| @@ -834,9 +856,9 @@ void TCPSocketWin::LogConnectEnd(int net_error) {
|
| socklen_t addrlen = sizeof(source_address);
|
| int rv = getsockname(
|
| socket_, reinterpret_cast<struct sockaddr*>(&source_address), &addrlen);
|
| + int os_error = WSAGetLastError();
|
| if (rv != 0) {
|
| - LOG(ERROR) << "getsockname() [rv: " << rv
|
| - << "] error: " << WSAGetLastError();
|
| + LOG(ERROR) << "getsockname() [rv: " << rv << "] error: " << os_error;
|
| NOTREACHED();
|
| net_log_.EndEventWithNetErrorCode(NetLogEventType::TCP_CONNECT, rv);
|
| return;
|
| @@ -857,8 +879,8 @@ int TCPSocketWin::DoRead(IOBuffer* buf, int buf_len,
|
| core_->non_blocking_reads_initialized_ = true;
|
| }
|
| int rv = recv(socket_, buf->data(), buf_len, 0);
|
| + int os_error = WSAGetLastError();
|
| if (rv == SOCKET_ERROR) {
|
| - int os_error = WSAGetLastError();
|
| if (os_error != WSAEWOULDBLOCK) {
|
| int net_error = MapSystemError(os_error);
|
| net_log_.AddEvent(NetLogEventType::SOCKET_READ_ERROR,
|
| @@ -887,6 +909,7 @@ void TCPSocketWin::DidCompleteConnect() {
|
|
|
| WSANETWORKEVENTS events;
|
| int rv;
|
| + int os_error = 0;
|
| {
|
| // TODO(pkasting): Remove ScopedTracker below once crbug.com/462784 is
|
| // fixed.
|
| @@ -894,11 +917,10 @@ void TCPSocketWin::DidCompleteConnect() {
|
| FROM_HERE_WITH_EXPLICIT_FUNCTION(
|
| "462784 TCPSocketWin::DidCompleteConnect -> WSAEnumNetworkEvents"));
|
| rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent, &events);
|
| + os_error = WSAGetLastError();
|
| }
|
| - int os_error = 0;
|
| if (rv == SOCKET_ERROR) {
|
| NOTREACHED();
|
| - os_error = WSAGetLastError();
|
| result = MapSystemError(os_error);
|
| } else if (events.lNetworkEvents & FD_CONNECT) {
|
| os_error = events.iErrorCode[FD_CONNECT_BIT];
|
| @@ -927,11 +949,11 @@ void TCPSocketWin::DidCompleteWrite() {
|
| DWORD num_bytes, flags;
|
| BOOL ok = WSAGetOverlappedResult(socket_, &core_->write_overlapped_,
|
| &num_bytes, FALSE, &flags);
|
| + int os_error = WSAGetLastError();
|
| WSAResetEvent(core_->write_overlapped_.hEvent);
|
| waiting_write_ = false;
|
| int rv;
|
| if (!ok) {
|
| - int os_error = WSAGetLastError();
|
| rv = MapSystemError(os_error);
|
| net_log_.AddEvent(NetLogEventType::SOCKET_WRITE_ERROR,
|
| CreateNetLogSocketErrorCallback(rv, os_error));
|
| @@ -965,8 +987,9 @@ void TCPSocketWin::DidSignalRead() {
|
| WSANETWORKEVENTS network_events;
|
| int rv = WSAEnumNetworkEvents(socket_, core_->read_overlapped_.hEvent,
|
| &network_events);
|
| + os_error = WSAGetLastError();
|
| +
|
| if (rv == SOCKET_ERROR) {
|
| - os_error = WSAGetLastError();
|
| rv = MapSystemError(os_error);
|
| } else if (network_events.lNetworkEvents) {
|
| // TODO(pkasting): Remove ScopedTracker below once crbug.com/462778 is
|
|
|