From 1563f6f65b853924d53c90f736f6c2486f613cb0 Mon Sep 17 00:00:00 2001 Message-Id: <1563f6f65b853924d53c90f736f6c2486f613cb0.1715497141.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sat, 10 Nov 2007 13:42:11 +0000 Subject: [PATCH] server shouldn't crash on client disconnect! Organization: Straylight/Edgeware From: Richard Kettlewell --- lib/event.c | 4 ++++ server/server.c | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/event.c b/lib/event.c index 0745695..c42eca3 100644 --- a/lib/event.c +++ b/lib/event.c @@ -976,10 +976,12 @@ static int writer_shutdown(ev_source *ev, ev_fd_cancel(ev, ev_write, w->fd); w->timeout = 0; if(w->reader) { + info("found a tied reader"); /* If there is a reader still around we just untie it */ w->reader->writer = 0; shutdown(w->fd, SHUT_WR); /* there'll be no more writes */ } else { + info("no tied reader"); /* There's no reader so we are free to close the FD */ xclose(w->fd); } @@ -1237,10 +1239,12 @@ static int reader_shutdown(ev_source *ev, ev_fd_cancel(ev, ev_read, r->fd); r->eof = 1; if(r->writer) { + info("found a tied writer"); /* If there is a writer still around we just untie it */ r->writer->reader = 0; shutdown(r->fd, SHUT_RD); /* there'll be no more reads */ } else { + info("no tied writer found"); /* There's no writer so we are free to close the FD */ xclose(r->fd); } diff --git a/server/server.c b/server/server.c index 4b71e4e..89447c0 100644 --- a/server/server.c +++ b/server/server.c @@ -109,13 +109,16 @@ static int writer_error(ev_source attribute((unused)) *ev, struct conn *c = u; D(("server writer_error %d", errno_value)); + info("writer_error S%x %d", c->tag, errno_value); if(errno_value == 0) { /* writer is done */ error(errno_value, "S%x writer completed", c->tag); /* TODO */ } else { if(errno_value != EPIPE) error(errno_value, "S%x write error on socket", c->tag); + info("cancel reader"); ev_reader_cancel(c->r); + info("done cancel reader"); } ev_report(ev); return 0; @@ -127,7 +130,8 @@ static int reader_error(ev_source attribute((unused)) *ev, struct conn *c = u; D(("server reader_error %d", errno_value)); - error(errno, "S%x read error on socket", c->tag); + info("reader_error S%x %d", c->tag, errno_value); + error(errno_value, "S%x read error on socket", c->tag); ev_writer_close(c->w); ev_report(ev); return 0; @@ -1082,7 +1086,6 @@ static int reader_callback(ev_source attribute((unused)) *ev, if(eof) { if(bytes) error(0, "S%x unterminated line", c->tag); - c->r = 0; return ev_writer_close(c->w); } return 0; -- [mdw]