]> git.meshlink.io Git - utcp/blobdiff - utcp.c
Ensure FIN packets start the retransmission timer as well.
[utcp] / utcp.c
diff --git a/utcp.c b/utcp.c
index 5ba4eaade2f585d6ad39a702cadef13c64b01e2a..89a38b7d1c9546e94458531031b2ea419dad9cd6 100644 (file)
--- a/utcp.c
+++ b/utcp.c
@@ -273,6 +273,7 @@ static void free_connection(struct utcp_connection *c) {
        memmove(cp, cp + 1, (utcp->nconnections - i - 1) * sizeof *cp);
        utcp->nconnections--;
 
+       buffer_exit(&c->rcvbuf);
        buffer_exit(&c->sndbuf);
        free(c);
 }
@@ -318,6 +319,7 @@ static struct utcp_connection *allocate_connection(struct utcp *utcp, uint16_t s
        }
 
        if(!buffer_init(&c->rcvbuf, DEFAULT_RCVBUFSIZE, DEFAULT_MAXRCVBUFSIZE)) {
+               buffer_exit(&c->sndbuf);
                free(c);
                return NULL;
        }
@@ -1260,6 +1262,8 @@ int utcp_shutdown(struct utcp_connection *c, int dir) {
        c->snd.last++;
 
        ack(c, false);
+       if(!timerisset(&c->rtrx_timeout))
+               start_retransmit_timer(c);
        return 0;
 }
 
@@ -1416,6 +1420,7 @@ void utcp_exit(struct utcp *utcp) {
        for(int i = 0; i < utcp->nconnections; i++) {
                if(!utcp->connections[i]->reapable)
                        debug("Warning, freeing unclosed connection %p\n", utcp->connections[i]);
+               buffer_exit(&utcp->connections[i]->rcvbuf);
                buffer_exit(&utcp->connections[i]->sndbuf);
                free(utcp->connections[i]);
        }