diff --git a/src/core/iomgr/socket_utils_posix.c b/src/core/iomgr/socket_utils_posix.c
index e8c80710377fc33178c670aed26171d2bb25ea29..06c5033d45733e2a1d5ca2e2d5b0fcf2f341283d 100644
--- a/src/core/iomgr/socket_utils_posix.c
+++ b/src/core/iomgr/socket_utils_posix.c
@@ -50,12 +50,22 @@ int grpc_accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen,
 
   fd = accept(sockfd, addr, addrlen);
   if (fd >= 0) {
-    flags = fcntl(fd, F_GETFL, 0);
-    flags |= nonblock ? O_NONBLOCK : 0;
-    flags |= cloexec ? FD_CLOEXEC : 0;
-    GPR_ASSERT(fcntl(fd, F_SETFL, flags) == 0);
+    if (nonblock) {
+      flags = fcntl(fd, F_GETFL, 0);
+      if (flags < 0) goto close_and_error;
+      if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) goto close_and_error;
+    }
+    if (cloexec) {
+      flags = fcntl(fd, F_GETFD, 0);
+      if (flags < 0) goto close_and_error;
+      if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) != 0) goto close_and_error;
+    }
   }
   return fd;
+
+close_and_error:
+  close(fd);
+  return -1;
 }
 
 #endif /* GPR_POSIX_SOCKETUTILS */