diff options
| author | Remi Collet <remi@remirepo.net> | 2021-10-20 14:55:07 +0200 | 
|---|---|---|
| committer | Remi Collet <remi@php.net> | 2021-10-20 14:55:07 +0200 | 
| commit | d44d225c5ad7c7116642f0b2fd4cf3ba32f0ca02 (patch) | |
| tree | 350c9fbfc0cb0c05289f094912d0c8e1c30d1899 | |
| parent | 6d23ce82e0edabe6a28a2eea5a493b6f4186a5c2 (diff) | |
fix PHP-FPM oob R/W in root process leading to priv escalation
  CVE-2021-21703
use libicu version 69
use oracle client library version 21.3
| -rw-r--r-- | php-bug81026.patch | 429 | ||||
| -rw-r--r-- | php.spec | 17 | 
2 files changed, 441 insertions, 5 deletions
| diff --git a/php-bug81026.patch b/php-bug81026.patch new file mode 100644 index 0000000..9da6398 --- /dev/null +++ b/php-bug81026.patch @@ -0,0 +1,429 @@ +From 169a33e8d990d49c69b40a4dbab4b2f56721693f Mon Sep 17 00:00:00 2001 +From: Jakub Zelenka <bukka@php.net> +Date: Sat, 2 Oct 2021 22:53:41 +0100 +Subject: [PATCH 1/2] Fix bug #81026 (PHP-FPM oob R/W in root process leading + to priv escalation) + +The main change is to store scoreboard procs directly to the variable sized +array rather than indirectly through the pointer. + +Signed-off-by: Stanislav Malyshev <stas@php.net> +(cherry picked from commit cb2021e5f69da5e2868130a05bb53db0f9f89e4b) +--- + sapi/fpm/fpm/fpm_children.c    |  14 ++--- + sapi/fpm/fpm/fpm_request.c     |   4 +- + sapi/fpm/fpm/fpm_scoreboard.c  | 106 ++++++++++++++++++++------------- + sapi/fpm/fpm/fpm_scoreboard.h  |  11 ++-- + sapi/fpm/fpm/fpm_status.c      |   4 +- + sapi/fpm/fpm/fpm_worker_pool.c |   2 +- + 6 files changed, 81 insertions(+), 60 deletions(-) + +diff --git a/sapi/fpm/fpm/fpm_children.c b/sapi/fpm/fpm/fpm_children.c +index bda85ef5a8..48380de542 100644 +--- a/sapi/fpm/fpm/fpm_children.c ++++ b/sapi/fpm/fpm/fpm_children.c +@@ -239,7 +239,7 @@ void fpm_children_bury() /* {{{ */ +  + 			fpm_child_unlink(child); +  +-			fpm_scoreboard_proc_free(wp->scoreboard, child->scoreboard_i); ++			fpm_scoreboard_proc_free(child); +  + 			fpm_clock_get(&tv1); +  +@@ -249,9 +249,9 @@ void fpm_children_bury() /* {{{ */ + 				if (!fpm_pctl_can_spawn_children()) { + 					severity = ZLOG_DEBUG; + 				} +-				zlog(severity, "[pool %s] child %d exited %s after %ld.%06d seconds from start", child->wp->config->name, (int) pid, buf, tv2.tv_sec, (int) tv2.tv_usec); ++				zlog(severity, "[pool %s] child %d exited %s after %ld.%06d seconds from start", wp->config->name, (int) pid, buf, tv2.tv_sec, (int) tv2.tv_usec); + 			} else { +-				zlog(ZLOG_DEBUG, "[pool %s] child %d has been killed by the process management after %ld.%06d seconds from start", child->wp->config->name, (int) pid, tv2.tv_sec, (int) tv2.tv_usec); ++				zlog(ZLOG_DEBUG, "[pool %s] child %d has been killed by the process management after %ld.%06d seconds from start", wp->config->name, (int) pid, tv2.tv_sec, (int) tv2.tv_usec); + 			} +  + 			fpm_child_close(child, 1 /* in event_loop */); +@@ -317,7 +317,7 @@ static struct fpm_child_s *fpm_resources_prepare(struct fpm_worker_pool_s *wp) / + 		return 0; + 	} +  +-	if (0 > fpm_scoreboard_proc_alloc(wp->scoreboard, &c->scoreboard_i)) { ++	if (0 > fpm_scoreboard_proc_alloc(c)) { + 		fpm_stdio_discard_pipes(c); + 		fpm_child_free(c); + 		return 0; +@@ -329,7 +329,7 @@ static struct fpm_child_s *fpm_resources_prepare(struct fpm_worker_pool_s *wp) / +  + static void fpm_resources_discard(struct fpm_child_s *child) /* {{{ */ + { +-	fpm_scoreboard_proc_free(child->wp->scoreboard, child->scoreboard_i); ++	fpm_scoreboard_proc_free(child); + 	fpm_stdio_discard_pipes(child); + 	fpm_child_free(child); + } +@@ -342,10 +342,10 @@ static void fpm_child_resources_use(struct fpm_child_s *child) /* {{{ */ + 		if (wp == child->wp) { + 			continue; + 		} +-		fpm_scoreboard_free(wp->scoreboard); ++		fpm_scoreboard_free(wp); + 	} +  +-	fpm_scoreboard_child_use(child->wp->scoreboard, child->scoreboard_i, getpid()); ++	fpm_scoreboard_child_use(child, getpid()); + 	fpm_stdio_child_use_pipes(child); + 	fpm_child_free(child); + } +diff --git a/sapi/fpm/fpm/fpm_request.c b/sapi/fpm/fpm/fpm_request.c +index a4ace85310..deaccf432a 100644 +--- a/sapi/fpm/fpm/fpm_request.c ++++ b/sapi/fpm/fpm/fpm_request.c +@@ -286,7 +286,7 @@ int fpm_request_is_idle(struct fpm_child_s *child) /* {{{ */ + 	struct fpm_scoreboard_proc_s *proc; +  + 	/* no need in atomicity here */ +-	proc = fpm_scoreboard_proc_get(child->wp->scoreboard, child->scoreboard_i); ++	proc = fpm_scoreboard_proc_get_from_child(child); + 	if (!proc) { + 		return 0; + 	} +@@ -301,7 +301,7 @@ int fpm_request_last_activity(struct fpm_child_s *child, struct timeval *tv) /* +  + 	if (!tv) return -1; +  +-	proc = fpm_scoreboard_proc_get(child->wp->scoreboard, child->scoreboard_i); ++	proc = fpm_scoreboard_proc_get_from_child(child); + 	if (!proc) { + 		return -1; + 	} +diff --git a/sapi/fpm/fpm/fpm_scoreboard.c b/sapi/fpm/fpm/fpm_scoreboard.c +index 7a65fcbeb7..091efdc574 100644 +--- a/sapi/fpm/fpm/fpm_scoreboard.c ++++ b/sapi/fpm/fpm/fpm_scoreboard.c +@@ -7,6 +7,7 @@ + #include <time.h> +  + #include "fpm_config.h" ++#include "fpm_children.h" + #include "fpm_scoreboard.h" + #include "fpm_shm.h" + #include "fpm_sockets.h" +@@ -24,7 +25,6 @@ static float fpm_scoreboard_tick; + int fpm_scoreboard_init_main() /* {{{ */ + { + 	struct fpm_worker_pool_s *wp; +-	unsigned int i; +  + #ifdef HAVE_TIMES + #if (defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)) +@@ -41,7 +41,7 @@ int fpm_scoreboard_init_main() /* {{{ */ +  +  + 	for (wp = fpm_worker_all_pools; wp; wp = wp->next) { +-		size_t scoreboard_size, scoreboard_nprocs_size; ++		size_t scoreboard_procs_size; + 		void *shm_mem; +  + 		if (wp->config->pm_max_children < 1) { +@@ -54,22 +54,15 @@ int fpm_scoreboard_init_main() /* {{{ */ + 			return -1; + 		} +  +-		scoreboard_size        = sizeof(struct fpm_scoreboard_s) + (wp->config->pm_max_children) * sizeof(struct fpm_scoreboard_proc_s *); +-		scoreboard_nprocs_size = sizeof(struct fpm_scoreboard_proc_s) * wp->config->pm_max_children; +-		shm_mem                = fpm_shm_alloc(scoreboard_size + scoreboard_nprocs_size); ++		scoreboard_procs_size = sizeof(struct fpm_scoreboard_proc_s) * wp->config->pm_max_children; ++		shm_mem = fpm_shm_alloc(sizeof(struct fpm_scoreboard_s) + scoreboard_procs_size); +  + 		if (!shm_mem) { + 			return -1; + 		} +-		wp->scoreboard         = shm_mem; ++		wp->scoreboard = shm_mem; ++		wp->scoreboard->pm = wp->config->pm; + 		wp->scoreboard->nprocs = wp->config->pm_max_children; +-		shm_mem               += scoreboard_size; +- +-		for (i = 0; i < wp->scoreboard->nprocs; i++, shm_mem += sizeof(struct fpm_scoreboard_proc_s)) { +-			wp->scoreboard->procs[i] = shm_mem; +-		} +- +-		wp->scoreboard->pm          = wp->config->pm; + 		wp->scoreboard->start_epoch = time(NULL); + 		strlcpy(wp->scoreboard->pool, wp->config->name, sizeof(wp->scoreboard->pool)); + 	} +@@ -163,28 +156,48 @@ struct fpm_scoreboard_s *fpm_scoreboard_get() /* {{{*/ + } + /* }}} */ +  +-struct fpm_scoreboard_proc_s *fpm_scoreboard_proc_get(struct fpm_scoreboard_s *scoreboard, int child_index) /* {{{*/ ++static inline struct fpm_scoreboard_proc_s *fpm_scoreboard_proc_get_ex( ++		struct fpm_scoreboard_s *scoreboard, int child_index, unsigned int nprocs) /* {{{*/ + { + 	if (!scoreboard) { +-		scoreboard = fpm_scoreboard; ++		return NULL; + 	} +  +-	if (!scoreboard) { ++	if (child_index < 0 || (unsigned int)child_index >= nprocs) { + 		return NULL; + 	} +  ++	return &scoreboard->procs[child_index]; ++} ++/* }}} */ ++ ++struct fpm_scoreboard_proc_s *fpm_scoreboard_proc_get( ++		struct fpm_scoreboard_s *scoreboard, int child_index) /* {{{*/ ++{ ++	if (!scoreboard) { ++		scoreboard = fpm_scoreboard; ++	} ++ + 	if (child_index < 0) { + 		child_index = fpm_scoreboard_i; + 	} +  +-	if (child_index < 0 || (unsigned int)child_index >= scoreboard->nprocs) { +-		return NULL; +-	} ++	return fpm_scoreboard_proc_get_ex(scoreboard, child_index, scoreboard->nprocs); ++} ++/* }}} */ +  +-	return scoreboard->procs[child_index]; ++struct fpm_scoreboard_proc_s *fpm_scoreboard_proc_get_from_child(struct fpm_child_s *child) /* {{{*/ ++{ ++	struct fpm_worker_pool_s *wp = child->wp; ++	unsigned int nprocs = wp->config->pm_max_children; ++	struct fpm_scoreboard_s *scoreboard = wp->scoreboard; ++	int child_index = child->scoreboard_i; ++ ++	return fpm_scoreboard_proc_get_ex(scoreboard, child_index, nprocs); + } + /* }}} */ +  ++ + struct fpm_scoreboard_s *fpm_scoreboard_acquire(struct fpm_scoreboard_s *scoreboard, int nohang) /* {{{ */ + { + 	struct fpm_scoreboard_s *s; +@@ -235,28 +248,28 @@ void fpm_scoreboard_proc_release(struct fpm_scoreboard_proc_s *proc) /* {{{ */ + 	proc->lock = 0; + } +  +-void fpm_scoreboard_free(struct fpm_scoreboard_s *scoreboard) /* {{{ */ ++void fpm_scoreboard_free(struct fpm_worker_pool_s *wp) /* {{{ */ + { +-	size_t scoreboard_size, scoreboard_nprocs_size; ++	size_t scoreboard_procs_size; ++	struct fpm_scoreboard_s *scoreboard = wp->scoreboard; +  + 	if (!scoreboard) { + 		zlog(ZLOG_ERROR, "**scoreboard is NULL"); + 		return; + 	} +  +-	scoreboard_size        = sizeof(struct fpm_scoreboard_s) + (scoreboard->nprocs) * sizeof(struct fpm_scoreboard_proc_s *); +-	scoreboard_nprocs_size = sizeof(struct fpm_scoreboard_proc_s) * scoreboard->nprocs; ++	scoreboard_procs_size = sizeof(struct fpm_scoreboard_proc_s) * wp->config->pm_max_children; +  +-	fpm_shm_free(scoreboard, scoreboard_size + scoreboard_nprocs_size); ++	fpm_shm_free(scoreboard, sizeof(struct fpm_scoreboard_s) + scoreboard_procs_size); + } + /* }}} */ +  +-void fpm_scoreboard_child_use(struct fpm_scoreboard_s *scoreboard, int child_index, pid_t pid) /* {{{ */ ++void fpm_scoreboard_child_use(struct fpm_child_s *child, pid_t pid) /* {{{ */ + { + 	struct fpm_scoreboard_proc_s *proc; +-	fpm_scoreboard = scoreboard; +-	fpm_scoreboard_i = child_index; +-	proc = fpm_scoreboard_proc_get(scoreboard, child_index); ++	fpm_scoreboard = child->wp->scoreboard; ++	fpm_scoreboard_i = child->scoreboard_i; ++	proc = fpm_scoreboard_proc_get_from_child(child); + 	if (!proc) { + 		return; + 	} +@@ -265,18 +278,22 @@ void fpm_scoreboard_child_use(struct fpm_scoreboard_s *scoreboard, int child_ind + } + /* }}} */ +  +-void fpm_scoreboard_proc_free(struct fpm_scoreboard_s *scoreboard, int child_index) /* {{{ */ ++void fpm_scoreboard_proc_free(struct fpm_child_s *child) /* {{{ */ + { ++	struct fpm_worker_pool_s *wp = child->wp; ++	struct fpm_scoreboard_s *scoreboard = wp->scoreboard; ++	int child_index = child->scoreboard_i; ++ + 	if (!scoreboard) { + 		return; + 	} +  +-	if (child_index < 0 || (unsigned int)child_index >= scoreboard->nprocs) { ++	if (child_index < 0 || child_index >= wp->config->pm_max_children) { + 		return; + 	} +  +-	if (scoreboard->procs[child_index] && scoreboard->procs[child_index]->used > 0) { +-		memset(scoreboard->procs[child_index], 0, sizeof(struct fpm_scoreboard_proc_s)); ++	if (scoreboard->procs[child_index].used > 0) { ++		memset(&scoreboard->procs[child_index], 0, sizeof(struct fpm_scoreboard_proc_s)); + 	} +  + 	/* set this slot as free to avoid search on next alloc */ +@@ -284,41 +301,44 @@ void fpm_scoreboard_proc_free(struct fpm_scoreboard_s *scoreboard, int child_ind + } + /* }}} */ +  +-int fpm_scoreboard_proc_alloc(struct fpm_scoreboard_s *scoreboard, int *child_index) /* {{{ */ ++int fpm_scoreboard_proc_alloc(struct fpm_child_s *child) /* {{{ */ + { + 	int i = -1; ++	struct fpm_worker_pool_s *wp = child->wp; ++	struct fpm_scoreboard_s *scoreboard = wp->scoreboard; ++	int nprocs = wp->config->pm_max_children; +  +-	if (!scoreboard || !child_index) { ++	if (!scoreboard) { + 		return -1; + 	} +  + 	/* first try the slot which is supposed to be free */ +-	if (scoreboard->free_proc >= 0 && (unsigned int)scoreboard->free_proc < scoreboard->nprocs) { +-		if (scoreboard->procs[scoreboard->free_proc] && !scoreboard->procs[scoreboard->free_proc]->used) { ++	if (scoreboard->free_proc >= 0 && scoreboard->free_proc < nprocs) { ++		if (!scoreboard->procs[scoreboard->free_proc].used) { + 			i = scoreboard->free_proc; + 		} + 	} +  + 	if (i < 0) { /* the supposed free slot is not, let's search for a free slot */ + 		zlog(ZLOG_DEBUG, "[pool %s] the proc->free_slot was not free. Let's search", scoreboard->pool); +-		for (i = 0; i < (int)scoreboard->nprocs; i++) { +-			if (scoreboard->procs[i] && !scoreboard->procs[i]->used) { /* found */ ++		for (i = 0; i < nprocs; i++) { ++			if (!scoreboard->procs[i].used) { /* found */ + 				break; + 			} + 		} + 	} +  + 	/* no free slot */ +-	if (i < 0 || i >= (int)scoreboard->nprocs) { ++	if (i < 0 || i >= nprocs) { + 		zlog(ZLOG_ERROR, "[pool %s] no free scoreboard slot", scoreboard->pool); + 		return -1; + 	} +  +-	scoreboard->procs[i]->used = 1; +-	*child_index = i; ++	scoreboard->procs[i].used = 1; ++	child->scoreboard_i = i; +  + 	/* supposed next slot is free */ +-	if (i + 1 >= (int)scoreboard->nprocs) { ++	if (i + 1 >= nprocs) { + 		scoreboard->free_proc = 0; + 	} else { + 		scoreboard->free_proc = i + 1; +diff --git a/sapi/fpm/fpm/fpm_scoreboard.h b/sapi/fpm/fpm/fpm_scoreboard.h +index abce616d76..6405abb7cf 100644 +--- a/sapi/fpm/fpm/fpm_scoreboard.h ++++ b/sapi/fpm/fpm/fpm_scoreboard.h +@@ -64,7 +64,7 @@ struct fpm_scoreboard_s { + 	unsigned int nprocs; + 	int free_proc; + 	unsigned long int slow_rq; +-	struct fpm_scoreboard_proc_s *procs[]; ++	struct fpm_scoreboard_proc_s procs[]; + }; +  + int fpm_scoreboard_init_main(); +@@ -73,18 +73,19 @@ int fpm_scoreboard_init_child(struct fpm_worker_pool_s *wp); + void fpm_scoreboard_update(int idle, int active, int lq, int lq_len, int requests, int max_children_reached, int slow_rq, int action, struct fpm_scoreboard_s *scoreboard); + struct fpm_scoreboard_s *fpm_scoreboard_get(); + struct fpm_scoreboard_proc_s *fpm_scoreboard_proc_get(struct fpm_scoreboard_s *scoreboard, int child_index); ++struct fpm_scoreboard_proc_s *fpm_scoreboard_proc_get_from_child(struct fpm_child_s *child); +  + struct fpm_scoreboard_s *fpm_scoreboard_acquire(struct fpm_scoreboard_s *scoreboard, int nohang); + void fpm_scoreboard_release(struct fpm_scoreboard_s *scoreboard); + struct fpm_scoreboard_proc_s *fpm_scoreboard_proc_acquire(struct fpm_scoreboard_s *scoreboard, int child_index, int nohang); + void fpm_scoreboard_proc_release(struct fpm_scoreboard_proc_s *proc); +  +-void fpm_scoreboard_free(struct fpm_scoreboard_s *scoreboard); ++void fpm_scoreboard_free(struct fpm_worker_pool_s *wp); +  +-void fpm_scoreboard_child_use(struct fpm_scoreboard_s *scoreboard, int child_index, pid_t pid); ++void fpm_scoreboard_child_use(struct fpm_child_s *child, pid_t pid); +  +-void fpm_scoreboard_proc_free(struct fpm_scoreboard_s *scoreboard, int child_index); +-int fpm_scoreboard_proc_alloc(struct fpm_scoreboard_s *scoreboard, int *child_index); ++void fpm_scoreboard_proc_free(struct fpm_child_s *child); ++int fpm_scoreboard_proc_alloc(struct fpm_child_s *child); +  + #ifdef HAVE_TIMES + float fpm_scoreboard_get_tick(); +diff --git a/sapi/fpm/fpm/fpm_status.c b/sapi/fpm/fpm/fpm_status.c +index 1d78ebf849..45852a5b39 100644 +--- a/sapi/fpm/fpm/fpm_status.c ++++ b/sapi/fpm/fpm/fpm_status.c +@@ -402,10 +402,10 @@ int fpm_status_handle_request(void) /* {{{ */ +  + 			first = 1; + 			for (i=0; i<scoreboard_p->nprocs; i++) { +-				if (!scoreboard_p->procs[i] || !scoreboard_p->procs[i]->used) { ++				if (!scoreboard_p->procs[i].used) { + 					continue; + 				} +-				proc = *scoreboard_p->procs[i]; ++				proc = scoreboard_p->procs[i]; +  + 				if (first) { + 					first = 0; +diff --git a/sapi/fpm/fpm/fpm_worker_pool.c b/sapi/fpm/fpm/fpm_worker_pool.c +index 90e155975e..96b7ca50fc 100644 +--- a/sapi/fpm/fpm/fpm_worker_pool.c ++++ b/sapi/fpm/fpm/fpm_worker_pool.c +@@ -43,7 +43,7 @@ static void fpm_worker_pool_cleanup(int which, void *arg) /* {{{ */ + 		fpm_worker_pool_config_free(wp->config); + 		fpm_children_free(wp->children); + 		if ((which & FPM_CLEANUP_CHILD) == 0 && fpm_globals.parent_pid == getpid()) { +-			fpm_scoreboard_free(wp->scoreboard); ++			fpm_scoreboard_free(wp); + 		} + 		fpm_worker_pool_free(wp); + 	} +--  +2.31.1 + +From 28c4ee7da2cf3428113e07326dbd46550c50c2bd Mon Sep 17 00:00:00 2001 +From: Remi Collet <remi@remirepo.net> +Date: Wed, 20 Oct 2021 14:11:20 +0200 +Subject: [PATCH 2/2] NEWS + +--- + NEWS | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/NEWS b/NEWS +index 0c1a77167c..f9abcbad3a 100644 +--- a/NEWS ++++ b/NEWS +@@ -1,6 +1,12 @@ + PHP                                                                        NEWS + ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| +  ++Backported from 7.4.25 ++ ++- FPM: ++  . Fixed bug #81026 (PHP-FPM oob R/W in root process leading to privilege ++    escalation) (CVE-2021-21703). (Jakub Zelenka) ++ + Backported from 7.3.30 +  + - Phar: +--  +2.31.1 + @@ -55,7 +55,7 @@  %global mysql_sock %(mysql_config --socket  2>/dev/null || echo /var/lib/mysql/mysql.sock) -%global oraclever 21.1 +%global oraclever 21.3  %global oraclelib 21.1  # Build for LiteSpeed Web Server (LSAPI) @@ -126,7 +126,7 @@  Summary: PHP scripting language for creating dynamic web sites  Name: %{?scl_prefix}php  Version: %{upver}%{?rcver:~%{rcver}} -Release: 17%{?dist} +Release: 18%{?dist}  # All files licensed under PHP version 3.01, except  # Zend is licensed under Zend  # TSRM is licensed under BSD @@ -217,6 +217,7 @@ Patch224: php-bug80710.patch  Patch225: php-bug81122.patch  Patch226: php-bug76450.patch  Patch227: php-bug81211.patch +Patch228: php-bug81026.patch  # Fixes for tests (300+)  # Factory is droped from system tzdata @@ -865,7 +866,7 @@ Group: System Environment/Libraries  License: PHP  Requires: %{?scl_prefix}php-common%{?_isa} = %{version}-%{release}  # Upstream requires 4.0, we require 50 to ensure use of libicu-last -BuildRequires: libicu-devel >= 50 +BuildRequires: libicu-devel >= 69  %description intl  The %{?scl_prefix}php-intl package contains a dynamic shared object that will add @@ -979,6 +980,7 @@ sed -e 's/php-devel/%{?scl_prefix}php-devel/' -i scripts/phpize.in  %patch225 -p1 -b .bug81122  %patch226 -p1 -b .bug76450  %patch227 -p1 -b .bug81211 +%patch228 -p1 -b .bug81026  # Fixes for tests  %patch300 -p1 -b .datetests @@ -1380,8 +1382,7 @@ popd  %check  %if %runselftest - -cd build-apache +cd build-fpm  # Run tests, using the CLI SAPI  export NO_INTERACTION=1 REPORT_EXIT_STATUS=1 MALLOC_CHECK_=2 @@ -1943,6 +1944,12 @@ EOF  %changelog +* Wed Oct 20 2021 Remi Collet <remi@remirepo.net> - 7.1.33-18 +- fix PHP-FPM oob R/W in root process leading to priv escalation +  CVE-2021-21703 +- use libicu version 69 +- use oracle client library version 21.3 +  * Tue Sep  7 2021 Remi Collet <remi@remirepo.net> - 7.1.33-17  - fix intl build on F35 | 
