summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Dingledine <arma@torproject.org>2004-09-28 21:14:40 +0000
committerRoger Dingledine <arma@torproject.org>2004-09-28 21:14:40 +0000
commitd381aa46960f6ea5db2a29d6abd0d30d34c23b46 (patch)
treea2b75d9e0307312e84a52449dc317b35d6f13285
parent25beea22bf6dfb2e5fa2c9688144935543dff172 (diff)
downloadtor-d381aa46960f6ea5db2a29d6abd0d30d34c23b46.tar.gz
tor-d381aa46960f6ea5db2a29d6abd0d30d34c23b46.zip
Fix an evil bug: when we failed to write to our log, fputs()
gave us a sigpipe, and we logged that we were ignoring it, causing us to fail to log that, and delete the log entry. Then when the signal handler exited, we proceeded to delete the log entry that had already been deleted. Now we make sure to only log inside our signal handler if we'll be exit()ing right after. svn:r2388
-rw-r--r--src/or/main.c11
-rw-r--r--src/or/test.c1
2 files changed, 10 insertions, 2 deletions
diff --git a/src/or/main.c b/src/or/main.c
index 8076403940..bea5dbe1f4 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -49,6 +49,7 @@ static int nfds=0; /**< Number of connections currently active. */
static int please_dumpstats=0; /**< Whether we should dump stats during the loop. */
static int please_reset=0; /**< Whether we just got a sighup. */
static int please_reap_children=0; /**< Whether we should waitpid for exited children. */
+static int please_sigpipe=0; /**< Whether we've caught a sigpipe lately. */
static int please_shutdown=0; /**< Whether we should shut down Tor. */
#endif /* signal stuff */
@@ -833,6 +834,10 @@ static int do_main_loop(void) {
}
please_shutdown = 0;
}
+ if(please_sigpipe) {
+ log(LOG_NOTICE,"Caught sigpipe. Ignoring.");
+ please_sigpipe = 0;
+ }
if(please_dumpstats) {
/* prefer to log it at INFO, but make sure we always see it */
dumpstats(get_min_log_level()>LOG_INFO ? get_min_log_level() : LOG_INFO);
@@ -898,7 +903,9 @@ static void catch(int the_signal) {
please_shutdown = 1;
break;
case SIGPIPE:
- log(LOG_NOTICE,"Caught sigpipe. Ignoring.");
+ /* don't log here, since it's possible you got the sigpipe because
+ * your log failed! */
+ please_sigpipe = 1;
break;
case SIGHUP:
please_reset = 1;
@@ -911,6 +918,8 @@ static void catch(int the_signal) {
break;
default:
log(LOG_WARN,"Caught signal %d that we can't handle??", the_signal);
+ tor_cleanup();
+ exit(1);
}
#endif /* signal stuff */
}
diff --git a/src/or/test.c b/src/or/test.c
index 0ee815227f..f09399144c 100644
--- a/src/or/test.c
+++ b/src/or/test.c
@@ -1024,7 +1024,6 @@ test_dir_format()
test_eq(0, is_obsolete_version("0.0.5.1-cvs", "0.0.5"));
test_eq(0, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs"));
- test_eq(0, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs"));
test_eq(1, tor_version_as_new_as(
"Tor 0.0.8 on Darwin 64-121-192-100.c3-0.sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8rc2"));
test_eq(0, tor_version_as_new_as(