1 --- httpd-2.2.24/server/mpm/prefork/prefork.c~ 2012-07-27 21:51:57.000000000 +0200
2 +++ httpd-2.2.24/server/mpm/prefork/prefork.c 2013-04-09 17:58:05.772765411 +0200
3 @@ -1043,14 +1043,31 @@
7 + process_score *child_record;
8 processed_status = ap_process_child_status(&pid, exitwhy, status);
9 + child_slot = find_child_by_pid(&pid);
10 if (processed_status == APEXIT_CHILDFATAL) {
11 - mpm_state = AP_MPMQ_STOPPING;
13 + /* fix race condition found in PR 39311
14 + * A child created at the same time as a graceful happens
15 + * can find the lock missing and create a fatal error.
16 + * It is not fatal for the last generation to be in this state.
18 + child_record = ap_get_scoreboard_process(child_slot);
20 + || child_record->generation
21 + == ap_my_generation) {
22 + mpm_state = AP_MPMQ_STOPPING;
26 + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ap_server_conf,
27 + "Ignoring fatal error in child of previous "
28 + "generation (pid %ld).",
33 /* non-fatal death... note that it's gone in the scoreboard. */
34 - child_slot = find_child_by_pid(&pid);
35 if (child_slot >= 0) {
36 (void) ap_update_child_status_from_indexes(child_slot, 0, SERVER_DEAD,
37 (request_rec *) NULL);