summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjulien.pierre.bugs%sun.com <devnull@localhost>2006-04-22 01:37:36 +0000
committerjulien.pierre.bugs%sun.com <devnull@localhost>2006-04-22 01:37:36 +0000
commite4b13cf1c3c52091fb9283d3b76397b9e73468eb (patch)
tree524285a33efb64a1979cc66896f17246565e64f4
parenteec7c564e26dc792a588541d047565c313da9fdd (diff)
downloadnss-hg-e4b13cf1c3c52091fb9283d3b76397b9e73468eb.tar.gz
Fix for bug 331413 . replace signal with sigaction; fix logging. r=wtchang
Bugzilla Bug 331413: assert that the worker threads empty the jobQ before they terminate. Fix a socket leak when the SSL_ImportFD call in handle_connection fails. r=nelson.bolyard.
-rw-r--r--security/nss/cmd/selfserv/selfserv.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/security/nss/cmd/selfserv/selfserv.c b/security/nss/cmd/selfserv/selfserv.c
index 5c8673ed8..b7ab1b82c 100644
--- a/security/nss/cmd/selfserv/selfserv.c
+++ b/security/nss/cmd/selfserv/selfserv.c
@@ -600,6 +600,8 @@ terminateWorkerThreads(void)
while (threadCount > 0) {
PZ_WaitCondVar(threadCountChangeCv, PR_INTERVAL_NO_TIMEOUT);
}
+ /* The worker threads empty the jobQ before they terminate. */
+ PORT_Assert(PR_CLIST_IS_EMPTY(&jobQ));
PZ_Unlock(qLock);
DESTROY_CONDVAR(jobQNotEmptyCv);
@@ -824,11 +826,8 @@ handle_fdx_connection(
cleanup:
if (ssl_sock) {
PR_Close(ssl_sock);
- } else
- {
- if (tcp_sock) {
- PR_Close(tcp_sock);
- }
+ } else if (tcp_sock) {
+ PR_Close(tcp_sock);
}
VLOG(("selfserv: handle_fdx_connection: exiting"));
@@ -886,7 +885,6 @@ reload_crl(PRFileDesc *crlFile)
void stop_server()
{
stopping = 1;
- VLOG(("selfserv: handle_connection: stop command"));
PR_Interrupt(acceptorThread);
PZ_TraceFlush();
}
@@ -1178,6 +1176,8 @@ handle_connection(
cleanup:
if (ssl_sock) {
PR_Close(ssl_sock);
+ } else if (tcp_sock) {
+ PR_Close(tcp_sock);
}
if (local_file_fd)
PR_Close(local_file_fd);
@@ -1185,6 +1185,7 @@ cleanup:
/* do a nice shutdown if asked. */
if (!strncmp(buf, stopCmd, sizeof stopCmd - 1)) {
+ VLOG(("selfserv: handle_connection: stop command"));
stop_server();
}
VLOG(("selfserv: handle_connection: exiting"));
@@ -1195,6 +1196,7 @@ cleanup:
void sigusr1_handler(int sig)
{
+ VLOG(("selfserv: sigusr1_handler: stop server"));
stop_server();
}
@@ -1209,6 +1211,7 @@ do_accepts(
{
PRNetAddr addr;
PRErrorCode perr;
+ struct sigaction act;
VLOG(("selfserv: do_accepts: starting"));
PR_SetThreadPriority( PR_GetCurrentThread(), PR_PRIORITY_HIGH);
@@ -1216,7 +1219,10 @@ do_accepts(
acceptorThread = PR_GetCurrentThread();
#ifdef XP_UNIX
/* set up the signal handler */
- if (signal(SIGUSR1, sigusr1_handler) == SIG_ERR) {
+ act.sa_handler = sigusr1_handler;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+ if (sigaction(SIGUSR1, &act, NULL)) {
fprintf(stderr, "Error installing signal handler.\n");
exit(1);
}