Commit 571b20fb authored by Yann Ylavic's avatar Yann Ylavic
Browse files

MPMs: early initialize scoreboard's child generation number.

Since [mpm]_note_child_killed uses the scoreboard's generation number for
child_status hook (MPM_CHILD_EXITED), we must initialize it early (i.e. in
[mpm]_note_child_started where MPM_CHILD_STARTED is set) to avoid race
conditions on restart (e.g. storm/loop of restarts) leading to AH00546.

PR 62658.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1839571 13f79535-47bb-0310-9956-ffa450edef68
parent d1961450
Loading
Loading
Loading
Loading
+3 −3
Changes for server/mpm/event/event.c: 3 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -748,10 +748,10 @@ static void event_note_child_killed(int childnum, pid_t pid, ap_generation_t gen

static void event_note_child_started(int slot, pid_t pid)
{
    ap_generation_t gen = retained->mpm->my_generation;
    ap_scoreboard_image->parent[slot].pid = pid;
    ap_run_child_status(ap_server_conf,
                        ap_scoreboard_image->parent[slot].pid,
                        retained->mpm->my_generation, slot, MPM_CHILD_STARTED);
    ap_scoreboard_image->parent[slot].generation = gen;
    ap_run_child_status(ap_server_conf, pid, gen, slot, MPM_CHILD_STARTED);
}

static const char *event_get_name(void)
+3 −3
Changes for server/mpm/motorz/motorz.c: 3 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -573,10 +573,10 @@ static void motorz_note_child_killed(int childnum, pid_t pid,

static void motorz_note_child_started(motorz_core_t *mz, int slot, pid_t pid)
{
    ap_generation_t gen = mz->mpm->my_generation;
    ap_scoreboard_image->parent[slot].pid = pid;
    ap_run_child_status(ap_server_conf,
                        ap_scoreboard_image->parent[slot].pid,
                        mz->mpm->my_generation, slot, MPM_CHILD_STARTED);
    ap_scoreboard_image->parent[slot].generation = gen;
    ap_run_child_status(ap_server_conf, pid, gen, slot, MPM_CHILD_STARTED);
}

/* a clean exit from a child with proper cleanup */
+1 −0
Changes for server/mpm/netware/mpm_netware.c: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -886,6 +886,7 @@ static int netware_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s)

    /* Only set slot 0 since that is all NetWare will ever have. */
    ap_scoreboard_image->parent[0].pid = getpid();
    ap_scoreboard_image->parent[0].generation = ap_my_generation;
    ap_run_child_status(ap_server_conf,
                        ap_scoreboard_image->parent[0].pid,
                        ap_my_generation,
+3 −3
Changes for server/mpm/prefork/prefork.c: 3 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -209,10 +209,10 @@ static void prefork_note_child_killed(int childnum, pid_t pid,

static void prefork_note_child_started(int slot, pid_t pid)
{
    ap_generation_t gen = retained->mpm->my_generation;
    ap_scoreboard_image->parent[slot].pid = pid;
    ap_run_child_status(ap_server_conf,
                        ap_scoreboard_image->parent[slot].pid,
                        retained->mpm->my_generation, slot, MPM_CHILD_STARTED);
    ap_scoreboard_image->parent[slot].generation = gen;
    ap_run_child_status(ap_server_conf, pid, gen, slot, MPM_CHILD_STARTED);
}

/* a clean exit from a child with proper cleanup */
+1 −0
Changes for server/mpm/winnt/mpm_winnt.c: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -139,6 +139,7 @@ AP_INIT_TAKE1("ThreadLimit", set_thread_limit, NULL, RSRC_CONF,
static void winnt_note_child_started(int slot, pid_t pid)
{
    ap_scoreboard_image->parent[slot].pid = pid;
    ap_scoreboard_image->parent[slot].generation = my_generation;
    ap_run_child_status(ap_server_conf,
                        ap_scoreboard_image->parent[slot].pid,
                        my_generation, slot, MPM_CHILD_STARTED);
Loading