From 04078a597cf0499623fdd0c0b5a33bf4172435ac 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 --- NEWS | 3 +++ sapi/fpm/fpm/events/port.c | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 0b4e25645b9b1..faf0d3dc002ca 100644 --- a/NEWS +++ b/NEWS @@ -11,6 +11,9 @@ PHP NEWS (cmb) . Fixed bug #80972 (Memory exhaustion on invalid string offset). (girgias) +- FPM: + . Fixed bug #65800 (Events port mechanism). (psumbera) + - FTP: . Fixed bug #80901 (Info leak in ftp extension). (cmb) . Fixed bug #79100 (Wrong FTP error messages). (cmb) diff --git a/sapi/fpm/fpm/events/port.c b/sapi/fpm/fpm/events/port.c index 1ffcd20a0de45..1db628f3de009 100644 --- a/sapi/fpm/fpm/events/port.c +++ b/sapi/fpm/fpm/events/port.c @@ -114,7 +114,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 */ @@ -123,6 +124,8 @@ static int fpm_event_port_wait(struct fpm_event_queue_s *queue, unsigned long in /* wait for inconming 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) { @@ -130,6 +133,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; } }