chiark / gitweb /
fix server crash if log connection fails
authorRichard Kettlewell <rjk@greenend.org.uk>
Tue, 13 Nov 2007 20:44:37 +0000 (20:44 +0000)
committerRichard Kettlewell <rjk@greenend.org.uk>
Tue, 13 Nov 2007 20:44:37 +0000 (20:44 +0000)
lib/event.c
lib/logfd.c
server/server.c
server/speaker.c

index c42eca35119e85bb9896e5191e128135970e6890..96d7d6056ccbb1367b70d0ec0667dac47d2383d5 100644 (file)
@@ -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
index 60e5331944050ea31ce729bde8e58ce0f48af90a..a0a608fd549603ee3cf277e1606e006d4eba7886 100644 (file)
@@ -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
index 89447c00dacf85f55ed38466d5c0a75a69c5d52b..6bfee6b67323b8332c34c0710a80307943831012 100644 (file)
@@ -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;
 }
index 19f88b27a6d40f37f14abd98299ce407e10e89fc..bdebbbdd464ae504f7adc34ae7c710696a07c508 100644 (file)
@@ -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);