You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by tr...@apache.org on 2003/05/09 21:05:50 UTC
cvs commit: apache-1.3/src/main http_main.c
trawick 2003/05/09 12:05:50
Modified: src CHANGES
src/main http_main.c
Log:
Don't block synchronous signals (e.g., SIGSEGV) while waiting for
and holding a pthread accept mutex.
Reviewed by: Jim Jagielski, Bill Stoddard
Revision Changes Path
1.1891 +4 -1 apache-1.3/src/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/apache-1.3/src/CHANGES,v
retrieving revision 1.1890
retrieving revision 1.1891
diff -u -r1.1890 -r1.1891
--- CHANGES 5 May 2003 11:45:48 -0000 1.1890
+++ CHANGES 9 May 2003 19:05:47 -0000 1.1891
@@ -1,5 +1,8 @@
Changes with Apache 1.3.28
-
+
+ *) Don't block synchronous signals (e.g., SIGSEGV) while waiting for
+ and holding a pthread accept mutex. [Jeff Trawick]
+
*) AIX: Change the default accept mechanism from pthread back to
fcntl. Idle child cleanup doesn't work when the child selected
for termination by the parent is waiting on a pthread mutex, and
1.603 +44 -0 apache-1.3/src/main/http_main.c
Index: http_main.c
===================================================================
RCS file: /home/cvs/apache-1.3/src/main/http_main.c,v
retrieving revision 1.602
retrieving revision 1.603
diff -u -r1.602 -r1.603
--- http_main.c 25 Apr 2003 13:50:23 -0000 1.602
+++ http_main.c 9 May 2003 19:05:49 -0000 1.603
@@ -650,6 +650,49 @@
accept_mutex = (void *)(caddr_t)-1;
}
+/* remove_sync_sigs() is from APR 0.9.4
+ *
+ * It is invalid to block synchronous signals, as such signals must
+ * be delivered on the thread that generated the original error
+ * (e.g., invalid storage reference). Blocking them interferes
+ * with proper recovery.
+ */
+static void remove_sync_sigs(sigset_t *sig_mask)
+{
+#ifdef SIGABRT
+ sigdelset(sig_mask, SIGABRT);
+#endif
+#ifdef SIGBUS
+ sigdelset(sig_mask, SIGBUS);
+#endif
+#ifdef SIGEMT
+ sigdelset(sig_mask, SIGEMT);
+#endif
+#ifdef SIGFPE
+ sigdelset(sig_mask, SIGFPE);
+#endif
+#ifdef SIGILL
+ sigdelset(sig_mask, SIGILL);
+#endif
+#ifdef SIGIOT
+ sigdelset(sig_mask, SIGIOT);
+#endif
+#ifdef SIGPIPE
+ sigdelset(sig_mask, SIGPIPE);
+#endif
+#ifdef SIGSEGV
+ sigdelset(sig_mask, SIGSEGV);
+#endif
+#ifdef SIGSYS
+ sigdelset(sig_mask, SIGSYS);
+#endif
+#ifdef SIGTRAP
+ sigdelset(sig_mask, SIGTRAP);
+#endif
+
+/* APR logic to remove SIGUSR2 not copied */
+}
+
static void accept_mutex_init_pthread(pool *p)
{
pthread_mutexattr_t mattr;
@@ -689,6 +732,7 @@
sigdelset(&accept_block_mask, SIGHUP);
sigdelset(&accept_block_mask, SIGTERM);
sigdelset(&accept_block_mask, SIGUSR1);
+ remove_sync_sigs(&accept_block_mask);
ap_register_cleanup(p, NULL, accept_mutex_cleanup_pthread, ap_null_cleanup);
}