From ada9c28dcf715bd6f61c1f2761a0a04f68f2a019 Mon Sep 17 00:00:00 2001 From: Joe Orton Date: Fri, 29 Jun 2007 09:31:11 +0000 Subject: [PATCH] Revert r547987 ("svn merge -c -547987 .") git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@551835 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 6 ---- include/mpm_common.h | 8 ----- server/main.c | 3 -- server/mpm/beos/mpm.h | 5 +-- server/mpm/experimental/event/event.c | 5 +-- server/mpm/experimental/event/mpm.h | 5 +-- server/mpm/experimental/leader/mpm.h | 5 +-- server/mpm/experimental/perchild/mpm.h | 5 +-- server/mpm/experimental/threadpool/mpm.h | 5 +-- server/mpm/mpmt_os2/mpm.h | 1 - server/mpm/mpmt_os2/mpmt_os2.c | 11 +------ server/mpm/netware/mpm.h | 5 +-- server/mpm/prefork/mpm.h | 5 +-- server/mpm/prefork/prefork.c | 15 +++------ server/mpm/worker/mpm.h | 5 +-- server/mpm/worker/worker.c | 7 +---- server/mpm_common.c | 39 ------------------------ server/scoreboard.c | 4 +-- 18 files changed, 16 insertions(+), 123 deletions(-) diff --git a/CHANGES b/CHANGES index b6dd095e59..471ca759c8 100644 --- a/CHANGES +++ b/CHANGES @@ -7,12 +7,6 @@ Changes with Apache 2.3.0 server-status page and ExtendedStatus enabled, for browsers which perform charset "detection". Reported by Stefan Esser. [Joe Orton] - *) SECURITY: CVE-2007-3304 (cve.mitre.org) - Add a parent process local table of child process PIDs, and - use that to ensure we are sending signals to just our child - processes by checking the scoreboard PID entries to our local - copy. [Jim Jagielski] - *) Event MPM: Add support for running under mod_ssl, by reverting to the Worker MPM behaviors, when run under an input filter that buffers its own data. [Paul Querna] diff --git a/include/mpm_common.h b/include/mpm_common.h index 1b69fb5e4c..20a74ac642 100644 --- a/include/mpm_common.h +++ b/include/mpm_common.h @@ -349,14 +349,6 @@ extern const char *ap_mpm_set_exception_hook(cmd_parms *cmd, void *dummy, const char *arg); #endif -/* - * The parent process pid table - */ -extern apr_table_t *ap_pid_table; -int ap_in_pid_table(pid_t pid); -void ap_set_pid_table(pid_t pid); -void ap_unset_pid_table(pid_t pid); - AP_DECLARE_HOOK(int,monitor,(apr_pool_t *p)) #ifdef __cplusplus diff --git a/server/main.c b/server/main.c index 8fe4f958fb..7285eae1a0 100644 --- a/server/main.c +++ b/server/main.c @@ -480,9 +480,6 @@ int main(int argc, const char * const argv[]) ap_server_pre_read_config = apr_array_make(pcommands, 1, sizeof(char *)); ap_server_post_read_config = apr_array_make(pcommands, 1, sizeof(char *)); ap_server_config_defines = apr_array_make(pcommands, 1, sizeof(char *)); -#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES - ap_pid_table = apr_table_make(pglobal, 1024); -#endif error = ap_setup_prelinked_modules(process); if (error) { diff --git a/server/mpm/beos/mpm.h b/server/mpm/beos/mpm.h index cadf36521a..d61594b060 100644 --- a/server/mpm/beos/mpm.h +++ b/server/mpm/beos/mpm.h @@ -31,10 +31,7 @@ #define MPM_NAME "Beos" #define MPM_CHILD_PID(i) (ap_scoreboard_image->servers[0][i].tid) -#define MPM_NOTE_CHILD_KILLED(i) do { \ - ap_unset_pid_table(MPM_CHILD_PID(i)); \ - MPM_CHILD_PID(i) = 0; \ - } while(0) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) #define AP_MPM_WANT_RECLAIM_CHILD_PROCESSES #define AP_MPM_WANT_WAIT_OR_TIMEOUT diff --git a/server/mpm/experimental/event/event.c b/server/mpm/experimental/event/event.c index be4b4b7d85..9d242b3867 100644 --- a/server/mpm/experimental/event/event.c +++ b/server/mpm/experimental/event/event.c @@ -1652,7 +1652,6 @@ static int make_child(server_rec * s, int slot) /* else */ ap_scoreboard_image->parent[slot].quiescing = 0; ap_scoreboard_image->parent[slot].pid = pid; - ap_set_pid_table(pid); return 0; } @@ -2072,12 +2071,10 @@ int ap_mpm_run(apr_pool_t * _pconf, apr_pool_t * plog, server_rec * s) active_children = 0; for (index = 0; index < ap_daemons_limit; ++index) { if (MPM_CHILD_PID(index) != 0) { - if (ap_in_pid_table(MPM_CHILD_PID(index))) { - if (kill(MPM_CHILD_PID(index), 0) == 0) { + if (kill(MPM_CHILD_PID(index), 0) == 0) { active_children = 1; /* Having just one child is enough to stay around */ break; - } } } } diff --git a/server/mpm/experimental/event/mpm.h b/server/mpm/experimental/event/mpm.h index c2731afd8c..cf4e61d911 100644 --- a/server/mpm/experimental/event/mpm.h +++ b/server/mpm/experimental/event/mpm.h @@ -50,10 +50,7 @@ #define AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK #define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) -#define MPM_NOTE_CHILD_KILLED(i) do { \ - ap_unset_pid_table(MPM_CHILD_PID(i)); \ - MPM_CHILD_PID(i) = 0; \ - } while(0) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) #define MPM_ACCEPT_FUNC unixd_accept extern int ap_threads_per_child; diff --git a/server/mpm/experimental/leader/mpm.h b/server/mpm/experimental/leader/mpm.h index 680c9ca691..d30be86a1f 100644 --- a/server/mpm/experimental/leader/mpm.h +++ b/server/mpm/experimental/leader/mpm.h @@ -50,10 +50,7 @@ #define AP_MPM_USES_POD 1 #define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) -#define MPM_NOTE_CHILD_KILLED(i) do { \ - ap_unset_pid_table(MPM_CHILD_PID(i)); \ - MPM_CHILD_PID(i) = 0; \ - } while(0) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) #define MPM_ACCEPT_FUNC unixd_accept extern int ap_threads_per_child; diff --git a/server/mpm/experimental/perchild/mpm.h b/server/mpm/experimental/perchild/mpm.h index c54863efe3..af97238728 100644 --- a/server/mpm/experimental/perchild/mpm.h +++ b/server/mpm/experimental/perchild/mpm.h @@ -49,10 +49,7 @@ #define AP_MPM_USES_POD #define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) -#define MPM_NOTE_CHILD_KILLED(i) do { \ - ap_unset_pid_table(MPM_CHILD_PID(i)); \ - MPM_CHILD_PID(i) = 0; \ - } while(0) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) #define MPM_ACCEPT_FUNC unixd_accept /* Table of child status */ diff --git a/server/mpm/experimental/threadpool/mpm.h b/server/mpm/experimental/threadpool/mpm.h index 624f37c89a..806011b885 100644 --- a/server/mpm/experimental/threadpool/mpm.h +++ b/server/mpm/experimental/threadpool/mpm.h @@ -49,10 +49,7 @@ #define AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK #define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) -#define MPM_NOTE_CHILD_KILLED(i) do { \ - ap_unset_pid_table(MPM_CHILD_PID(i)); \ - MPM_CHILD_PID(i) = 0; \ - } while(0) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) #define MPM_ACCEPT_FUNC unixd_accept extern int ap_threads_per_child; diff --git a/server/mpm/mpmt_os2/mpm.h b/server/mpm/mpmt_os2/mpm.h index e324d79a38..f8bbc30eb3 100644 --- a/server/mpm/mpmt_os2/mpm.h +++ b/server/mpm/mpmt_os2/mpm.h @@ -30,7 +30,6 @@ #include "httpd.h" #include "mpm_default.h" #include "scoreboard.h" -#include "mpm_common.h" #define MPM_NAME "MPMT_OS2" diff --git a/server/mpm/mpmt_os2/mpmt_os2.c b/server/mpm/mpmt_os2/mpmt_os2.c index 1d4a43d4b0..a5636cefda 100644 --- a/server/mpm/mpmt_os2/mpmt_os2.c +++ b/server/mpm/mpmt_os2/mpmt_os2.c @@ -281,7 +281,6 @@ static char master_main() #endif if (one_process) { ap_scoreboard_image->parent[0].pid = getpid(); - ap_set_pid_table(getpid()); ap_mpm_child_main(pconf); return FALSE; } @@ -308,7 +307,6 @@ static char master_main() rc = DosWaitChild(DCWA_PROCESSTREE, DCWW_NOWAIT, &proc_rc, &child_pid, 0); if (rc == 0) { - ap_unset_pid_table(child_pid); /* A child has terminated, remove its scoreboard entry & terminate if necessary */ for (slot=0; ap_scoreboard_image->parent[slot].pid != child_pid && slot < HARD_SERVER_LIMIT; slot++); @@ -332,13 +330,7 @@ static char master_main() /* Signal children to shut down, either gracefully or immediately */ for (slot=0; slotparent[n].pid; - if (ap_in_pid_table(pid)) { - kill(pid, is_graceful ? SIGHUP : SIGTERM); - ap_unset_pid_table(pid); - } + kill(ap_scoreboard_image->parent[slot].pid, is_graceful ? SIGHUP : SIGTERM); } DosFreeMem(parent_info); @@ -372,7 +364,6 @@ static void spawn_child(int slot) } ap_scoreboard_image->parent[slot].pid = proc_rc.codeTerminate; - ap_set_pid_table(proc_rc.codeTerminate); } diff --git a/server/mpm/netware/mpm.h b/server/mpm/netware/mpm.h index 93f1824e5a..106d62a509 100644 --- a/server/mpm/netware/mpm.h +++ b/server/mpm/netware/mpm.h @@ -48,10 +48,7 @@ */ #define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) -#define MPM_NOTE_CHILD_KILLED(i) do { \ - ap_unset_pid_table(MPM_CHILD_PID(i)); \ - MPM_CHILD_PID(i) = 0; \ - } while(0) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) extern int ap_threads_per_child; extern int ap_max_workers_limit; diff --git a/server/mpm/prefork/mpm.h b/server/mpm/prefork/mpm.h index 51743d2cca..bf1fb94999 100644 --- a/server/mpm/prefork/mpm.h +++ b/server/mpm/prefork/mpm.h @@ -52,10 +52,7 @@ #define AP_MPM_USES_POD 1 #define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) -#define MPM_NOTE_CHILD_KILLED(i) do { \ - ap_unset_pid_table(MPM_CHILD_PID(i)); \ - MPM_CHILD_PID(i) = 0; \ - } while(0) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) #define MPM_ACCEPT_FUNC unixd_accept extern int ap_threads_per_child; diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c index c173601179..5f0b1fbd0d 100644 --- a/server/mpm/prefork/prefork.c +++ b/server/mpm/prefork/prefork.c @@ -714,7 +714,6 @@ static int make_child(server_rec *s, int slot) } ap_scoreboard_image->parent[slot].pid = pid; - ap_set_pid_table(pid); return 0; } @@ -1097,10 +1096,8 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) for (index = 0; index < ap_daemons_limit; ++index) { if (ap_scoreboard_image->servers[index][0].status != SERVER_DEAD) { /* Ask each child to close its listeners. */ - if (ap_in_pid_table(MPM_CHILD_PID(index))) { - kill(MPM_CHILD_PID(index), AP_SIG_GRACEFUL); - active_children++; - } + kill(MPM_CHILD_PID(index), AP_SIG_GRACEFUL); + active_children++; } } @@ -1138,12 +1135,10 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) active_children = 0; for (index = 0; index < ap_daemons_limit; ++index) { if (MPM_CHILD_PID(index) != 0) { - if (ap_in_pid_table(MPM_CHILD_PID(index))) { - if (kill(MPM_CHILD_PID(index), 0) == 0) { + if (kill(MPM_CHILD_PID(index), 0) == 0) { active_children = 1; /* Having just one child is enough to stay around */ break; - } } } } @@ -1196,9 +1191,7 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) * piped loggers, etc. They almost certainly won't handle * it gracefully. */ - if (ap_in_pid_table(MPM_CHILD_PID(index))) { - kill(MPM_CHILD_PID(index), AP_SIG_GRACEFUL); - } + kill(ap_scoreboard_image->parent[index].pid, AP_SIG_GRACEFUL); } } } diff --git a/server/mpm/worker/mpm.h b/server/mpm/worker/mpm.h index a8585d375e..335f4b6ace 100644 --- a/server/mpm/worker/mpm.h +++ b/server/mpm/worker/mpm.h @@ -50,10 +50,7 @@ #define AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK #define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) -#define MPM_NOTE_CHILD_KILLED(i) do { \ - ap_unset_pid_table(MPM_CHILD_PID(i)); \ - MPM_CHILD_PID(i) = 0; \ - } while(0) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) #define MPM_ACCEPT_FUNC unixd_accept extern int ap_threads_per_child; diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c index f7e6c56c10..e8eca8c197 100644 --- a/server/mpm/worker/worker.c +++ b/server/mpm/worker/worker.c @@ -1360,8 +1360,6 @@ static int make_child(server_rec *s, int slot) } ap_scoreboard_image->parent[slot].quiescing = 0; ap_scoreboard_image->parent[slot].pid = pid; - ap_set_pid_table(pid); - return 0; } @@ -1602,7 +1600,6 @@ static void server_main_loop(int remaining_children_to_start) (request_rec *) NULL); ap_scoreboard_image->parent[child_slot].pid = 0; - ap_unset_pid_table(pid.pid); ap_scoreboard_image->parent[child_slot].quiescing = 0; if (processed_status == APEXIT_CHILDSICK) { /* resource shortage, minimize the fork rate */ @@ -1819,12 +1816,10 @@ int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) active_children = 0; for (index = 0; index < ap_daemons_limit; ++index) { if (MPM_CHILD_PID(index) != 0) { - if (ap_in_pid_table(MPM_CHILD_PID(index))) { - if (kill(MPM_CHILD_PID(index), 0) == 0) { + if (kill(MPM_CHILD_PID(index), 0) == 0) { active_children = 1; /* Having just one child is enough to stay around */ break; - } } } } diff --git a/server/mpm_common.c b/server/mpm_common.c index aec41a065f..6e485c70c2 100644 --- a/server/mpm_common.c +++ b/server/mpm_common.c @@ -87,41 +87,6 @@ typedef struct extra_process_t { static extra_process_t *extras; -/* - * Parent process local storage of child pids - */ -apr_table_t *ap_pid_table; - -/* - * Check the pid table to see if the actual pid exists - */ -int ap_in_pid_table(pid_t pid) { - char apid[64]; - const char *spid; - apr_snprintf(apid, sizeof(apid), "%" APR_PID_T_FMT, pid); - spid = apr_table_get(ap_pid_table, apid); - if (spid && spid[0] == '1' && spid[1] == '\0') - return 1; - else { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, - "child process %" APR_PID_T_FMT - " does not exist in local pid table", pid); - return 0; - } -} - -void ap_set_pid_table(pid_t pid) { - char apid[64]; - apr_snprintf(apid, sizeof(apid), "%" APR_PID_T_FMT, pid); - apr_table_set(ap_pid_table, apid, "1"); -} - -void ap_unset_pid_table(pid_t pid) { - char apid[64]; - apr_snprintf(apid, sizeof(apid), "%" APR_PID_T_FMT, pid); - apr_table_unset(ap_pid_table, apid); -} - void ap_register_extra_mpm_process(pid_t pid) { extra_process_t *p = (extra_process_t *)malloc(sizeof(extra_process_t)); @@ -149,7 +114,6 @@ int ap_unregister_extra_mpm_process(pid_t pid) extras = cur->next; } free(cur); - ap_unset_pid_table(pid); return 1; /* found */ } else { @@ -164,9 +128,6 @@ static int reclaim_one_pid(pid_t pid, action_t action) apr_status_t waitret; proc.pid = pid; - if (!ap_in_pid_table(pid)) { - return 0; - } waitret = apr_proc_wait(&proc, NULL, NULL, APR_NOWAIT); if (waitret != APR_CHILD_NOTDONE) { return 1; diff --git a/server/scoreboard.c b/server/scoreboard.c index 2e00452c95..99238bac23 100644 --- a/server/scoreboard.c +++ b/server/scoreboard.c @@ -35,7 +35,6 @@ #include "ap_mpm.h" #include "mpm.h" -#include "mpm_common.h" #include "scoreboard.h" AP_DECLARE_DATA scoreboard *ap_scoreboard_image = NULL; @@ -364,8 +363,7 @@ int find_child_by_pid(apr_proc_t *pid) ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons_limit); for (i = 0; i < max_daemons_limit; ++i) { - if (ap_scoreboard_image->parent[i].pid == pid->pid && - ap_in_pid_table(pid->pid)) { + if (ap_scoreboard_image->parent[i].pid == pid->pid) { return i; } } -- 2.40.0