From 38b8221fb0125d2c668611f75a9e03cf8ccc54f5 Mon Sep 17 00:00:00 2001 Message-Id: <38b8221fb0125d2c668611f75a9e03cf8ccc54f5.1716997732.git.mdw@distorted.org.uk> From: Mark Wooding Date: Tue, 13 Nov 2007 20:44:37 +0000 Subject: [PATCH] fix server crash if log connection fails Organization: Straylight/Edgeware From: Richard Kettlewell --- lib/event.c | 5 ++++- lib/logfd.c | 2 +- server/server.c | 13 ++++++++++--- server/speaker.c | 3 ++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/event.c b/lib/event.c index c42eca3..96d7d60 100644 --- a/lib/event.c +++ b/lib/event.c @@ -388,6 +388,7 @@ int ev_fd_cancel(ev_source *ev, ev_fdmode mode, int fd) { * cancelled. */ int ev_fd_enable(ev_source *ev, ev_fdmode mode, int fd) { + assert(fd >= 0); D(("enabling mode %s fd %d", modenames[mode], fd)); FD_SET(fd, &ev->mode[mode].enabled); return 0; @@ -971,7 +972,7 @@ static int writer_shutdown(ev_source *ev, if(w->fd == -1) return 0; /* already shut down */ - info("writer_shutdown fd=%d", w->fd); + info("writer_shutdown fd=%d error=%d", w->fd, w->error); ev_timeout_cancel(ev, w->timeout); ev_fd_cancel(ev, ev_write, w->fd); w->timeout = 0; @@ -1066,6 +1067,8 @@ static int ev_writer_write(struct sink *sk, const void *s, int n) { if(!n) return 0; /* avoid silliness */ + if(w->fd == -1) + error(0, "ev_writer_write on %s after shutdown", w->what); if(w->spacebound && w->b.end - w->b.start + n > w->spacebound) { /* The new buffer contents will exceed the space bound. We assume that the * remote client has gone away and TCP hasn't noticed yet, or that it's got diff --git a/lib/logfd.c b/lib/logfd.c index 60e5331..a0a608f 100644 --- a/lib/logfd.c +++ b/lib/logfd.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2005 Richard Kettlewell + * Copyright (C) 2005, 2007 Richard Kettlewell * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/server/server.c b/server/server.c index 89447c0..6bfee6b 100644 --- a/server/server.c +++ b/server/server.c @@ -116,10 +116,14 @@ static int writer_error(ev_source attribute((unused)) *ev, } else { if(errno_value != EPIPE) error(errno_value, "S%x write error on socket", c->tag); - info("cancel reader"); - ev_reader_cancel(c->r); + if(c->r) { + info("cancel reader"); + ev_reader_cancel(c->r); + c->r = 0; + } info("done cancel reader"); } + c->w = 0; ev_report(ev); return 0; } @@ -132,7 +136,10 @@ static int reader_error(ev_source attribute((unused)) *ev, D(("server reader_error %d", errno_value)); 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); + if(c->w) + ev_writer_close(c->w); + c->w = 0; + c->r = 0; ev_report(ev); return 0; } diff --git a/server/speaker.c b/server/speaker.c index 19f88b2..bdebbbd 100644 --- a/server/speaker.c +++ b/server/speaker.c @@ -586,6 +586,7 @@ int main(int argc, char **argv) { struct sockaddr_un addr; static const int one = 1; struct speaker_message sm; + const char *d; set_progname(argv); if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale"); @@ -599,7 +600,7 @@ int main(int argc, char **argv) { default: fatal(0, "invalid option"); } } - if(getenv("DISORDER_DEBUG_SPEAKER")) debugging = 1; + if((d = getenv("DISORDER_DEBUG_SPEAKER"))) debugging = atoi(d); /* If stderr is a TTY then log there, otherwise to syslog. */ if(!isatty(2)) { openlog(progname, LOG_PID, LOG_DAEMON); -- [mdw]