Index: webrtc/base/physicalsocketserver.cc |
diff --git a/webrtc/base/physicalsocketserver.cc b/webrtc/base/physicalsocketserver.cc |
index 67fbea0a2fc60bacd5b2711b62e0947888ca30cc..4cea0403df59b1a62842273364cfd4ea0e24144e 100644 |
--- a/webrtc/base/physicalsocketserver.cc |
+++ b/webrtc/base/physicalsocketserver.cc |
@@ -271,7 +271,8 @@ int PhysicalSocket::SetOption(Option opt, int value) { |
} |
int PhysicalSocket::Send(const void* pv, size_t cb) { |
- int sent = ::send(s_, reinterpret_cast<const char *>(pv), (int)cb, |
+ int sent = DoSend(s_, reinterpret_cast<const char *>(pv), |
+ static_cast<int>(cb), |
#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
// Suppress SIGPIPE. Without this, attempting to send on a socket whose |
// other end is closed will result in a SIGPIPE signal being raised to |
@@ -287,7 +288,8 @@ int PhysicalSocket::Send(const void* pv, size_t cb) { |
MaybeRemapSendError(); |
// We have seen minidumps where this may be false. |
ASSERT(sent <= static_cast<int>(cb)); |
- if ((sent < 0) && IsBlockingError(GetError())) { |
+ if ((sent > 0 && sent < static_cast<int>(cb)) || |
+ (sent < 0 && IsBlockingError(GetError()))) { |
enabled_events_ |= DE_WRITE; |
} |
return sent; |
@@ -298,7 +300,7 @@ int PhysicalSocket::SendTo(const void* buffer, |
const SocketAddress& addr) { |
sockaddr_storage saddr; |
size_t len = addr.ToSockAddrStorage(&saddr); |
- int sent = ::sendto( |
+ int sent = DoSendTo( |
s_, static_cast<const char *>(buffer), static_cast<int>(length), |
#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
// Suppress SIGPIPE. See above for explanation. |
@@ -311,7 +313,8 @@ int PhysicalSocket::SendTo(const void* buffer, |
MaybeRemapSendError(); |
// We have seen minidumps where this may be false. |
ASSERT(sent <= static_cast<int>(length)); |
- if ((sent < 0) && IsBlockingError(GetError())) { |
+ if ((sent > 0 && sent < static_cast<int>(length)) || |
+ (sent < 0 && IsBlockingError(GetError()))) { |
enabled_events_ |= DE_WRITE; |
} |
return sent; |
@@ -474,13 +477,25 @@ int PhysicalSocket::EstimateMTU(uint16_t* mtu) { |
#endif |
} |
- |
SOCKET PhysicalSocket::DoAccept(SOCKET socket, |
sockaddr* addr, |
socklen_t* addrlen) { |
return ::accept(socket, addr, addrlen); |
} |
+int PhysicalSocket::DoSend(SOCKET socket, const char* buf, int len, int flags) { |
+ return ::send(socket, buf, len, flags); |
+} |
+ |
+int PhysicalSocket::DoSendTo(SOCKET socket, |
+ const char* buf, |
+ int len, |
+ int flags, |
+ const struct sockaddr* dest_addr, |
+ socklen_t addrlen) { |
+ return ::sendto(socket, buf, len, flags, dest_addr, addrlen); |
+} |
+ |
void PhysicalSocket::OnResolveResult(AsyncResolverInterface* resolver) { |
if (resolver != resolver_) { |
return; |