From 6b4c5380d84791e18577872b7963b0fc5a0885ed Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 30 Jan 2013 10:34:57 +0100 Subject: [PATCH] lib9p: defer freeing srv for listensrv() use the Srv.end callback for freeing the srv and closing the file descriptor of a connection. this makes sure we wont free the srv while there are still outstanding requests that would access the srv when doing the respond() call. --- sys/src/lib9p/listen.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/sys/src/lib9p/listen.c b/sys/src/lib9p/listen.c index 547988472..8ba7ecb99 100644 --- a/sys/src/lib9p/listen.c +++ b/sys/src/lib9p/listen.c @@ -7,6 +7,7 @@ static void listenproc(void*); static void srvproc(void*); +static void srvend(Srv *); static char *getremotesys(char*); void @@ -57,6 +58,7 @@ listenproc(void *v) s->rpool = nil; s->rbuf = nil; s->wbuf = nil; + s->end = srvend; _forker(srvproc, s, 0); } free(os->addr); @@ -66,13 +68,13 @@ listenproc(void *v) static void srvproc(void *v) { - int data; - Srv *s; - - s = v; - data = s->infd; - srv(s); - close(data); + srv((Srv*)v); +} + +static void +srvend(Srv *s) +{ + close(s->infd); free(s->addr); free(s); }