diff --git a/NEWS b/NEWS index 6a56544a46c..ee902be48e4 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,8 @@ PHP NEWS . Fixed bug #68207 (Setting fastcgi.error_header can result in a WARNING). (Jakub Zelenka) . Fixed bug #80669 (FPM numeric user fails to set groups). (Jakub Zelenka) + . Fixed bug GH-8517 (Random crash of FPM master process in + fpm_stdio_child_said). (Jakub Zelenka) - MBString: . Fixed bug GH-9535 (The behavior of mb_strcut in mbstring has been changed in diff --git a/sapi/fpm/fpm/fpm_children.c b/sapi/fpm/fpm/fpm_children.c index 741fc276315..6a5787c7ec8 100644 --- a/sapi/fpm/fpm/fpm_children.c +++ b/sapi/fpm/fpm/fpm_children.c @@ -120,7 +120,7 @@ static void fpm_child_unlink(struct fpm_child_s *child) /* {{{ */ } /* }}} */ -static struct fpm_child_s *fpm_child_find(pid_t pid) /* {{{ */ +struct fpm_child_s *fpm_child_find(pid_t pid) /* {{{ */ { struct fpm_worker_pool_s *wp; struct fpm_child_s *child = 0; diff --git a/sapi/fpm/fpm/fpm_children.h b/sapi/fpm/fpm/fpm_children.h index 5ae4e2062e4..679c34ba038 100644 --- a/sapi/fpm/fpm/fpm_children.h +++ b/sapi/fpm/fpm/fpm_children.h @@ -10,13 +10,14 @@ #include "fpm_events.h" #include "zlog.h" +struct fpm_child_s; + int fpm_children_create_initial(struct fpm_worker_pool_s *wp); int fpm_children_free(struct fpm_child_s *child); void fpm_children_bury(void); int fpm_children_init_main(void); int fpm_children_make(struct fpm_worker_pool_s *wp, int in_event_loop, int nb_to_spawn, int is_debug); - -struct fpm_child_s; +struct fpm_child_s *fpm_child_find(pid_t pid); struct fpm_child_s { struct fpm_child_s *prev, *next; diff --git a/sapi/fpm/fpm/fpm_stdio.c b/sapi/fpm/fpm/fpm_stdio.c index 1dc65aaa345..46cf4aaa285 100644 --- a/sapi/fpm/fpm/fpm_stdio.c +++ b/sapi/fpm/fpm/fpm_stdio.c @@ -181,7 +181,10 @@ static void fpm_stdio_child_said(struct fpm_event_s *ev, short which, void *arg) if (!arg) { return; } - child = (struct fpm_child_s *)arg; + child = fpm_child_find((intptr_t) arg); + if (!child) { + return; + } is_stdout = (fd == child->fd_stdout); if (is_stdout) { @@ -327,10 +330,10 @@ int fpm_stdio_parent_use_pipes(struct fpm_child_s *child) /* {{{ */ child->fd_stdout = fd_stdout[0]; child->fd_stderr = fd_stderr[0]; - fpm_event_set(&child->ev_stdout, child->fd_stdout, FPM_EV_READ, fpm_stdio_child_said, child); + fpm_event_set(&child->ev_stdout, child->fd_stdout, FPM_EV_READ, fpm_stdio_child_said, (void *) (intptr_t) child->pid); fpm_event_add(&child->ev_stdout, 0); - fpm_event_set(&child->ev_stderr, child->fd_stderr, FPM_EV_READ, fpm_stdio_child_said, child); + fpm_event_set(&child->ev_stderr, child->fd_stderr, FPM_EV_READ, fpm_stdio_child_said, (void *) (intptr_t) child->pid); fpm_event_add(&child->ev_stderr, 0); return 0; }