mirror of
https://github.com/apache/httpd.git
synced 2025-08-10 02:02:49 +03:00
Revert r547987 ("svn merge -c -547987 .")
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@551835 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
6
CHANGES
6
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]
|
||||
|
@@ -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
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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 */
|
||||
|
@@ -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;
|
||||
|
@@ -30,7 +30,6 @@
|
||||
#include "httpd.h"
|
||||
#include "mpm_default.h"
|
||||
#include "scoreboard.h"
|
||||
#include "mpm_common.h"
|
||||
|
||||
#define MPM_NAME "MPMT_OS2"
|
||||
|
||||
|
@@ -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; slot<HARD_SERVER_LIMIT; slot++) {
|
||||
PID pid;
|
||||
|
||||
pid = ap_scoreboard_image->parent[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);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user