Merge pull request #1619 from maks-mishin/master

Add error handling for close socket
diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c
index 3bd20c6..7d51208 100644
--- a/src/iperf_server_api.c
+++ b/src/iperf_server_api.c
@@ -135,6 +135,7 @@
 iperf_accept(struct iperf_test *test)
 {
     int s;
+    int ret = -1;
     signed char rbuf = ACCESS_DENIED;
     socklen_t len;
     struct sockaddr_storage addr;
@@ -142,7 +143,7 @@
     len = sizeof(addr);
     if ((s = accept(test->listener, (struct sockaddr *) &addr, &len)) < 0) {
         i_errno = IEACCEPT;
-        return -1;
+        return ret;
     }
 
     if (test->ctrl_sck == -1) {
@@ -152,7 +153,7 @@
         int flag = 1;
         if (setsockopt(test->ctrl_sck, IPPROTO_TCP, TCP_NODELAY, (char *) &flag, sizeof(int))) {
             i_errno = IESETNODELAY;
-            return -1;
+            goto error_handling;
         }
 
 #if defined(HAVE_TCP_USER_TIMEOUT)
@@ -160,7 +161,7 @@
         if ((opt = test->settings->snd_timeout)) {
             if (setsockopt(s, IPPROTO_TCP, TCP_USER_TIMEOUT, &opt, sizeof(opt)) < 0) {
                 i_errno = IESETUSERTIMEOUT;
-                return -1;
+                goto error_handling;
             }
         }
 #endif /* HAVE_TCP_USER_TIMEOUT */
@@ -172,18 +173,18 @@
              * (i.e. timed out).
              */
             i_errno = IERECVCOOKIE;
-            return -1;
+            goto error_handling;
         }
-	FD_SET(test->ctrl_sck, &test->read_set);
-	if (test->ctrl_sck > test->max_fd) test->max_fd = test->ctrl_sck;
+    FD_SET(test->ctrl_sck, &test->read_set);
+    if (test->ctrl_sck > test->max_fd) test->max_fd = test->ctrl_sck;
 
-	if (iperf_set_send_state(test, PARAM_EXCHANGE) != 0)
-            return -1;
-        if (iperf_exchange_parameters(test) < 0)
-            return -1;
-	if (test->server_affinity != -1)
-	    if (iperf_setaffinity(test, test->server_affinity) != 0)
-		return -1;
+    if (iperf_set_send_state(test, PARAM_EXCHANGE) != 0)
+        goto error_handling;
+    if (iperf_exchange_parameters(test) < 0)
+        goto error_handling;
+    if (test->server_affinity != -1)
+        if (iperf_setaffinity(test, test->server_affinity) != 0)
+            goto error_handling;
         if (test->on_connect)
             test->on_connect(test);
     } else {
@@ -202,8 +203,10 @@
         }
         close(s);
     }
-
     return 0;
+    error_handling:
+        close(s);
+        return ret;
 }