de161c
diff --git a/src/iperf_sctp.c b/src/iperf_sctp.c
de161c
index a0869a3..13f5cdf 100644
de161c
--- a/src/iperf_sctp.c
de161c
+++ b/src/iperf_sctp.c
de161c
@@ -130,12 +130,14 @@ iperf_sctp_accept(struct iperf_test * test)
de161c
 
de161c
     if (Nread(s, cookie, COOKIE_SIZE, Psctp) < 0) {
de161c
         i_errno = IERECVCOOKIE;
de161c
+        close(s);
de161c
         return -1;
de161c
     }
de161c
 
de161c
-    if (strcmp(test->cookie, cookie) != 0) {
de161c
+    if (strncmp(test->cookie, cookie, COOKIE_SIZE) != 0) {
de161c
         if (Nwrite(s, (char*) &rbuf, sizeof(rbuf), Psctp) < 0) {
de161c
             i_errno = IESENDMESSAGE;
de161c
+            close(s);
de161c
             return -1;
de161c
         }
de161c
         close(s);
de161c
@@ -209,9 +211,11 @@ iperf_sctp_listen(struct iperf_test *test)
de161c
 
de161c
     /* servers must call sctp_bindx() _instead_ of bind() */
de161c
     if (!TAILQ_EMPTY(&test->xbind_addrs)) {
de161c
-        freeaddrinfo(res);
de161c
-        if (iperf_sctp_bindx(test, s, IPERF_SCTP_SERVER))
de161c
+        if (iperf_sctp_bindx(test, s, IPERF_SCTP_SERVER)) {
de161c
+            close(s);
de161c
+            freeaddrinfo(res);
de161c
             return -1;
de161c
+		}
de161c
     } else
de161c
     if (bind(s, (struct sockaddr *) res->ai_addr, res->ai_addrlen) < 0) {
de161c
         saved_errno = errno;
de161c
@@ -422,8 +426,11 @@ iperf_sctp_connect(struct iperf_test *test)
de161c
 
de161c
     /* clients must call bind() followed by sctp_bindx() before connect() */
de161c
     if (!TAILQ_EMPTY(&test->xbind_addrs)) {
de161c
-        if (iperf_sctp_bindx(test, s, IPERF_SCTP_CLIENT))
de161c
+        if (iperf_sctp_bindx(test, s, IPERF_SCTP_CLIENT)) {
de161c
+            freeaddrinfo(server_res);
de161c
+            close(s);
de161c
             return -1;
de161c
+        }
de161c
     }
de161c
 
de161c
     /* TODO support sctp_connectx() to avoid heartbeating. */
de161c
@@ -435,12 +442,12 @@ iperf_sctp_connect(struct iperf_test *test)
de161c
         i_errno = IESTREAMCONNECT;
de161c
         return -1;
de161c
     }
de161c
-    freeaddrinfo(server_res);
de161c
 
de161c
     /* Send cookie for verification */
de161c
     if (Nwrite(s, test->cookie, COOKIE_SIZE, Psctp) < 0) {
de161c
 	saved_errno = errno;
de161c
 	close(s);
de161c
+   freeaddrinfo(server_res);
de161c
 	errno = saved_errno;
de161c
         i_errno = IESENDCOOKIE;
de161c
         return -1;
de161c
@@ -464,6 +471,7 @@ iperf_sctp_connect(struct iperf_test *test)
de161c
         return -1;
de161c
     }
de161c
 
de161c
+    freeaddrinfo(server_res);
de161c
     return s;
de161c
 #else
de161c
     i_errno = IENOSCTP;