1
0
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:
Joe Orton
2007-06-29 09:31:11 +00:00
parent 8e9aeb9919
commit ada9c28dcf
18 changed files with 16 additions and 123 deletions

View File

@@ -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]

View File

@@ -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

View File

@@ -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) {

View File

@@ -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

View File

@@ -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;
}
}
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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;

View File

@@ -30,7 +30,6 @@
#include "httpd.h"
#include "mpm_default.h"
#include "scoreboard.h"
#include "mpm_common.h"
#define MPM_NAME "MPMT_OS2"

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);
}
}
}

View File

@@ -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;

View File

@@ -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;
}
}
}
}

View File

@@ -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;

View File

@@ -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;
}
}