diff --git a/src/iperf_api.c b/src/iperf_api.c index c645ef5cf..398c8aab8 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -4698,8 +4698,14 @@ iperf_free_stream(struct iperf_stream *sp) /* XXX: need to free interval list too! */ munmap(sp->buffer, sp->test->settings->blksize); close(sp->buffer_fd); - if (sp->diskfile_fd >= 0) - close(sp->diskfile_fd); + sp->buffer_fd = -1; + + if (sp->diskfile_fd >= 0) { + close(sp->diskfile_fd); + sp->diskfile_fd = -1; + } + + for (irp = TAILQ_FIRST(&sp->result->interval_results); irp != NULL; irp = nirp) { nirp = TAILQ_NEXT(irp, irlistentries); free(irp); @@ -4819,6 +4825,8 @@ iperf_new_stream(struct iperf_test *test, int s, int sender) if ((ret < 0) || (iperf_init_stream(sp, test) < 0)) { close(sp->buffer_fd); + sp->buffer_fd = -1; + munmap(sp->buffer, sp->test->settings->blksize); free(sp->result); free(sp); diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 37d741f87..124e16077 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -547,6 +547,7 @@ iperf_client_end(struct iperf_test *test) /* Close all stream sockets */ SLIST_FOREACH(sp, &test->streams, streams) { close(sp->socket); + sp->socket = -1; } /* show final summary */ @@ -559,8 +560,10 @@ iperf_client_end(struct iperf_test *test) } /* Close control socket */ - if (test->ctrl_sck >= 0) + if (test->ctrl_sck >= 0) { close(test->ctrl_sck); + test->ctrl_sck = -1; + } return 0; } diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 8e9b41623..60aaea191 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -274,6 +274,7 @@ iperf_handle_message_server(struct iperf_test *test) FD_CLR(sp->socket, &test->read_set); FD_CLR(sp->socket, &test->write_set); close(sp->socket); + sp->socket = -1; } test->reporter_callback(test); if (iperf_set_send_state(test, EXCHANGE_RESULTS) != 0) @@ -304,6 +305,7 @@ iperf_handle_message_server(struct iperf_test *test) FD_CLR(sp->socket, &test->read_set); FD_CLR(sp->socket, &test->write_set); close(sp->socket); + sp->socket = -1; } iperf_set_test_state(test, IPERF_DONE); break; @@ -324,6 +326,7 @@ server_timer_proc(TimerClientData client_data, struct iperf_time *nowP) if (test->done) return; test->done = 1; + close(test->ctrl_sck); test->ctrl_sck = -1; } @@ -844,9 +847,9 @@ iperf_run_server(struct iperf_test *test) if (test->no_delay || test->settings->mss || test->settings->socket_bufsize) { FD_CLR(test->listener, &test->read_set); close(test->listener); - test->listener = -1; + test->listener = -1; if ((s = netannounce(test->settings->domain, Ptcp, test->bind_address, test->bind_dev, test->server_port)) < 0) { - cleanup_server(test); + cleanup_server(test); i_errno = IELISTEN; return -1; }