summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Brinkmann <marcus@gnu.org>2001-02-12 17:24:36 +0000
committerMarcus Brinkmann <marcus@gnu.org>2001-02-12 17:24:36 +0000
commit2888457f4fc3ebfd5ec6e4f6baf5e02223b1c5c6 (patch)
treee5c428b9e17036ecffafcdbc7b14e6d9107fb706
parent9fc0f76454246c2c2f3984928627a22c76beec5a (diff)
2001-02-11 Marcus Brinkmann <marcus@gnu.org>
* connq.c (connq_destroy): New function. * connq.h: Prototype connq_destroy. * sock.c (sock_free): Call connq_destroy when listen or connect queue exist.
-rw-r--r--pflocal/ChangeLog7
-rw-r--r--pflocal/connq.c14
-rw-r--r--pflocal/connq.h3
-rw-r--r--pflocal/sock.c4
4 files changed, 28 insertions, 0 deletions
diff --git a/pflocal/ChangeLog b/pflocal/ChangeLog
index eb0f1fb1..80708cac 100644
--- a/pflocal/ChangeLog
+++ b/pflocal/ChangeLog
@@ -1,3 +1,10 @@
+2001-02-11 Marcus Brinkmann <marcus@gnu.org>
+
+ * connq.c (connq_destroy): New function.
+ * connq.h: Prototype connq_destroy.
+ * sock.c (sock_free): Call connq_destroy when listen or connect
+ queue exist.
+
2000-08-09 Mark Kettenis <kettenis@gnu.org>
* pf.c (S_socket_create): Only accept S_IFCHR, S_IFSOCK and
diff --git a/pflocal/connq.c b/pflocal/connq.c
index 862c9a14..2b8d68a4 100644
--- a/pflocal/connq.c
+++ b/pflocal/connq.c
@@ -108,6 +108,20 @@ connq_create (struct connq **cq)
*cq = new;
return 0;
}
+
+/* Destroy a queue. */
+void
+connq_destroy (struct connq *cq)
+{
+ /* Everybody in the queue should hold a reference to the socket
+ containing the queue. */
+ assert (cq->length == 0);
+ /* Nevertheless, malloc(0) or realloc(0) might allocate some small
+ space. */
+ if (cq->queue)
+ free (cq->queue);
+ free (cq);
+}
/* ---------------------------------------------------------------- */
diff --git a/pflocal/connq.h b/pflocal/connq.h
index 8486eb17..1039bff9 100644
--- a/pflocal/connq.h
+++ b/pflocal/connq.h
@@ -33,6 +33,9 @@ struct sock;
is already listening (change this with connq_set_length). */
error_t connq_create (struct connq **cq);
+/* Destroy a queue. */
+void connq_destroy (struct connq *cq);
+
/* Wait for a connection attempt to be made on CQ, and return the connecting
socket in SOCK, and a request tag in REQ. If REQ is NULL, the request is
left in the queue, otherwise connq_request_complete must be called on REQ
diff --git a/pflocal/sock.c b/pflocal/sock.c
index dffd6bf7..f37a2350 100644
--- a/pflocal/sock.c
+++ b/pflocal/sock.c
@@ -136,6 +136,10 @@ sock_free (struct sock *sock)
sock_shutdown (sock, SOCK_SHUTDOWN_READ | SOCK_SHUTDOWN_WRITE);
if (sock->id != MACH_PORT_NULL)
mach_port_destroy (mach_task_self (), sock->id);
+ if (sock->listen_queue)
+ connq_destroy (sock->listen_queue);
+ if (sock->connect_queue)
+ connq_destroy (sock->connect_queue);
free (sock);
}