From bc9e791d92717c577664e456a69c22d74412aadb Mon Sep 17 00:00:00 2001 From: Petr Sumbera Date: Mon, 10 May 2021 10:54:43 +0200 Subject: [PATCH] php-fpm: fix Solaris port events.mechanism Bug #65800 Fix by: rainer.jung@kippdata.de --- sapi/fpm/fpm/events/port.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/sapi/fpm/fpm/events/port.c b/sapi/fpm/fpm/events/port.c index db574cddaf4a8..09041840cd1d3 100644 --- a/sapi/fpm/fpm/events/port.c +++ b/sapi/fpm/fpm/events/port.c @@ -112,7 +112,8 @@ static int fpm_event_port_clean() /* {{{ */ */ static int fpm_event_port_wait(struct fpm_event_queue_s *queue, unsigned long int timeout) /* {{{ */ { - int ret, i, nget; + int ret; + unsigned int i, nget; timespec_t t; /* convert timeout into timespec_t */ @@ -121,6 +122,8 @@ static int fpm_event_port_wait(struct fpm_event_queue_s *queue, unsigned long in /* wait for incoming event or timeout. We want at least one event or timeout */ nget = 1; + events[0].portev_user = (void *)-1; /* so we can double check that an event was returned */ + ret = port_getn(pfd, events, nevents, &nget, &t); if (ret < 0) { @@ -128,6 +131,16 @@ static int fpm_event_port_wait(struct fpm_event_queue_s *queue, unsigned long in if (errno != EINTR && errno != ETIME) { zlog(ZLOG_WARNING, "poll() returns %d", errno); return -1; + } else if (nget > 0 && events[0].portev_user == (void *)-1) { + /* This confusing API can return an event at the same time + * that it reports EINTR or ETIME. If that occurs, just + * report the event. With EINTR, nget can be > 0 without + * any event, so check that portev_user was filled in. + * + * See discussion thread + * http://marc.info/?l=opensolaris-networking-discuss&m=125071205204540 + */ + nget = 0; } }