Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(147)

Unified Diff: runtime/bin/socket_macos.cc

Issue 2495003003: Adds some error handling to the socket implementation. (Closed)
Patch Set: Add perror calls for fcntl Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/bin/socket_linux.cc ('k') | tools/gn.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/bin/socket_macos.cc
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 3e082eb8e0ad9193d9453e6685d71166308ccd81..4d0f53d48d04a7d2a1ceff58bbf83332a4bf4e81 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -27,6 +27,13 @@
namespace dart {
namespace bin {
+static void SaveErrorAndClose(intptr_t fd) {
+ int err = errno;
+ VOID_TEMP_FAILURE_RETRY(close(fd));
+ errno = err;
+}
+
+
SocketAddress::SocketAddress(struct sockaddr* sa) {
ASSERT(INET6_ADDRSTRLEN >= INET_ADDRSTRLEN);
if (!Socket::FormatNumericAddress(*reinterpret_cast<RawAddr*>(sa), as_string_,
@@ -57,8 +64,14 @@ static intptr_t Create(const RawAddr& addr) {
if (fd < 0) {
return -1;
}
- FDUtils::SetCloseOnExec(fd);
- FDUtils::SetNonBlocking(fd);
+ if (!FDUtils::SetCloseOnExec(fd)) {
+ SaveErrorAndClose(fd);
+ return -1;
+ }
+ if (!FDUtils::SetNonBlocking(fd)) {
+ SaveErrorAndClose(fd);
+ return -1;
+ }
return fd;
}
@@ -69,7 +82,7 @@ static intptr_t Connect(intptr_t fd, const RawAddr& addr) {
if ((result == 0) || (errno == EINPROGRESS)) {
return fd;
}
- VOID_TEMP_FAILURE_RETRY(close(fd));
+ SaveErrorAndClose(fd);
return -1;
}
@@ -94,7 +107,7 @@ intptr_t Socket::CreateBindConnect(const RawAddr& addr,
intptr_t result = TEMP_FAILURE_RETRY(
bind(fd, &source_addr.addr, SocketAddress::GetAddrLength(source_addr)));
if ((result != 0) && (errno != EINPROGRESS)) {
- VOID_TEMP_FAILURE_RETRY(close(fd));
+ SaveErrorAndClose(fd);
return -1;
}
@@ -304,7 +317,10 @@ intptr_t Socket::CreateBindDatagram(const RawAddr& addr, bool reuseAddress) {
return -1;
}
- FDUtils::SetCloseOnExec(fd);
+ if (!FDUtils::SetCloseOnExec(fd)) {
+ SaveErrorAndClose(fd);
+ return -1;
+ }
if (reuseAddress) {
int optval = 1;
@@ -314,11 +330,14 @@ intptr_t Socket::CreateBindDatagram(const RawAddr& addr, bool reuseAddress) {
if (NO_RETRY_EXPECTED(
bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
- VOID_TEMP_FAILURE_RETRY(close(fd));
+ SaveErrorAndClose(fd);
return -1;
}
- FDUtils::SetNonBlocking(fd);
+ if (!FDUtils::SetNonBlocking(fd)) {
+ SaveErrorAndClose(fd);
+ return -1;
+ }
return fd;
}
@@ -357,7 +376,9 @@ AddressList<InterfaceSocketAddress>* Socket::ListInterfaces(
intptr_t count = 0;
for (struct ifaddrs* ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
- if (ShouldIncludeIfaAddrs(ifa, lookup_family)) count++;
+ if (ShouldIncludeIfaAddrs(ifa, lookup_family)) {
+ count++;
+ }
}
AddressList<InterfaceSocketAddress>* addresses =
@@ -387,7 +408,10 @@ intptr_t ServerSocket::CreateBindListen(const RawAddr& addr,
return -1;
}
- FDUtils::SetCloseOnExec(fd);
+ if (!FDUtils::SetCloseOnExec(fd)) {
+ SaveErrorAndClose(fd);
+ return -1;
+ }
int optval = 1;
VOID_NO_RETRY_EXPECTED(
@@ -401,7 +425,7 @@ intptr_t ServerSocket::CreateBindListen(const RawAddr& addr,
if (NO_RETRY_EXPECTED(
bind(fd, &addr.addr, SocketAddress::GetAddrLength(addr))) < 0) {
- VOID_TEMP_FAILURE_RETRY(close(fd));
+ SaveErrorAndClose(fd);
return -1;
}
@@ -411,18 +435,19 @@ intptr_t ServerSocket::CreateBindListen(const RawAddr& addr,
// Don't close the socket until we have created a new socket, ensuring
// that we do not get the bad port number again.
intptr_t new_fd = CreateBindListen(addr, backlog, v6_only);
- int err = errno;
- VOID_TEMP_FAILURE_RETRY(close(fd));
- errno = err;
+ SaveErrorAndClose(fd);
return new_fd;
}
if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
- VOID_TEMP_FAILURE_RETRY(close(fd));
+ SaveErrorAndClose(fd);
return -1;
}
- FDUtils::SetNonBlocking(fd);
+ if (!FDUtils::SetNonBlocking(fd)) {
+ SaveErrorAndClose(fd);
+ return -1;
+ }
return fd;
}
@@ -447,8 +472,14 @@ intptr_t ServerSocket::Accept(intptr_t fd) {
socket = kTemporaryFailure;
}
} else {
- FDUtils::SetCloseOnExec(socket);
- FDUtils::SetNonBlocking(socket);
+ if (!FDUtils::SetCloseOnExec(socket)) {
+ SaveErrorAndClose(socket);
+ return -1;
+ }
+ if (!FDUtils::SetNonBlocking(socket)) {
+ SaveErrorAndClose(socket);
+ return -1;
+ }
}
return socket;
}
« no previous file with comments | « runtime/bin/socket_linux.cc ('k') | tools/gn.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698