summaryrefslogblamecommitdiff
path: root/user/php7/no-max-ent-size.patch
blob: 7f28ba3f1b280ce49d3ccf6e707b1afdda16da8f (plain) (tree)
































































































































































































































































                                                                                                 
--- php-7.4.4/ext/posix/posix.c	2020-03-17 10:40:22.000000000 +0000
+++ php-7.4.4/ext/posix/posix.c	2020-03-27 03:19:13.133440186 +0000
@@ -1084,8 +1084,11 @@ PHP_FUNCTION(posix_getgrnam)
 	ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);
 
 #if defined(ZTS) && defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX)
+	errno = 0;
 	buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
-	if (buflen < 1) {
+	if (buflen == -1 && errno == 0) {
+		buflen = 1024;
+	} else if (buflen < 1) {
 		RETURN_FALSE;
 	}
 	buf = emalloc(buflen);
@@ -1127,9 +1130,7 @@ PHP_FUNCTION(posix_getgrgid)
 {
 	zend_long gid;
 #if defined(ZTS) && defined(HAVE_GETGRGID_R) && defined(_SC_GETGR_R_SIZE_MAX)
-	int ret;
 	struct group _g;
-	struct group *retgrptr = NULL;
 	long grbuflen;
 	char *grbuf;
 #endif
@@ -1141,20 +1142,27 @@ PHP_FUNCTION(posix_getgrgid)
 
 #if defined(ZTS) && defined(HAVE_GETGRGID_R) && defined(_SC_GETGR_R_SIZE_MAX)
 
+	errno = 0;
 	grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
-	if (grbuflen < 1) {
+	if (grbuflen == -1 && errno == 0) {
+		grbuflen = 1024;
+	} else if (grbuflen < 1) {
 		RETURN_FALSE;
 	}
-
 	grbuf = emalloc(grbuflen);
+try_again:
+	g = &_g;
 
-	ret = getgrgid_r(gid, &_g, grbuf, grbuflen, &retgrptr);
-	if (ret || retgrptr == NULL) {
-		POSIX_G(last_error) = ret;
+	if (getgrgid_r(gid, g, grbuf, grbuflen, &g) || g == NULL) {
+		if (errno == ERANGE) {
+			grbuflen *= 2;
+			grbuf = erealloc(grbuf, grbuflen);
+			goto try_again;
+		}
+		POSIX_G(last_error) = errno;
 		efree(grbuf);
 		RETURN_FALSE;
 	}
-	g = &_g;
 #else
 	if (NULL == (g = getgrgid(gid))) {
 		POSIX_G(last_error) = errno;
@@ -1210,14 +1218,23 @@ PHP_FUNCTION(posix_getpwnam)
 	ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);
 
 #if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWNAM_R)
+	errno = 0;
 	buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
-	if (buflen < 1) {
+	if (buflen == -1 && errno == 0) {
+		buflen = 1024;
+	} else if (buflen < 1) {
 		RETURN_FALSE;
 	}
 	buf = emalloc(buflen);
+try_again:
 	pw = &pwbuf;
 
 	if (getpwnam_r(name, pw, buf, buflen, &pw) || pw == NULL) {
+		if (errno == ERANGE) {
+			buflen *= 2;
+			buf = erealloc(buf, buflen);
+			goto try_again;
+		}
 		efree(buf);
 		POSIX_G(last_error) = errno;
 		RETURN_FALSE;
@@ -1248,10 +1265,8 @@ PHP_FUNCTION(posix_getpwuid)
 	zend_long uid;
 #if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R)
 	struct passwd _pw;
-	struct passwd *retpwptr = NULL;
 	long pwbuflen;
 	char *pwbuf;
-	int ret;
 #endif
 	struct passwd *pw;
 
@@ -1260,19 +1275,27 @@ PHP_FUNCTION(posix_getpwuid)
 	ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);
 
 #if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R)
+	errno = 0;
 	pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
-	if (pwbuflen < 1) {
+	if (pwbuflen == -1 && errno == 0) {
+		pwbuflen = 1024;
+	} else if (pwbuflen < 1) {
 		RETURN_FALSE;
 	}
 	pwbuf = emalloc(pwbuflen);
+try_again:
+	pw = &_pw;
 
-	ret = getpwuid_r(uid, &_pw, pwbuf, pwbuflen, &retpwptr);
-	if (ret || retpwptr == NULL) {
-		POSIX_G(last_error) = ret;
+	if (getpwuid_r(uid, pw, pwbuf, pwbuflen, &pw) || pw == NULL) {
+		if (errno == ERANGE) {
+			pwbuflen *= 2;
+			pwbuf = erealloc(pwbuf, pwbuflen);
+			goto try_again;
+		}
+		POSIX_G(last_error) = errno;
 		efree(pwbuf);
 		RETURN_FALSE;
 	}
-	pw = &_pw;
 #else
 	if (NULL == (pw = getpwuid(uid))) {
 		POSIX_G(last_error) = errno;
--- php-7.4.4/ext/standard/filestat.c	2020-03-17 10:40:30.000000000 +0000
+++ php-7.4.4/ext/standard/filestat.c	2020-03-27 04:00:18.333479165 +0000
@@ -302,15 +302,25 @@ PHPAPI int php_get_gid_by_name(const cha
 #if defined(ZTS) && defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX)
 		struct group gr;
 		struct group *retgrptr;
+		errno = 0;
 		long grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
 		char *grbuf;
 
-		if (grbuflen < 1) {
+		if (grbuflen == -1 && errno == 0) {
+			grbuflen = 1024;
+		} else if (grbuflen < 1) {
 			return FAILURE;
 		}
 
 		grbuf = emalloc(grbuflen);
-		if (getgrnam_r(name, &gr, grbuf, grbuflen, &retgrptr) != 0 || retgrptr == NULL) {
+try_again:
+		retgrptr = &gr;
+		if (getgrnam_r(name, &gr, grbuf, grbuflen, &retgrptr) || retgrptr == NULL) {
+			if (errno == ERANGE) {
+				grbuflen *= 2;
+				grbuf = erealloc(grbuf, grbuflen);
+				goto try_again;
+			}
 			efree(grbuf);
 			return FAILURE;
 		}
@@ -438,15 +448,25 @@ PHPAPI uid_t php_get_uid_by_name(const c
 #if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWNAM_R)
 		struct passwd pw;
 		struct passwd *retpwptr = NULL;
+		errno = 0;
 		long pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
 		char *pwbuf;
 
-		if (pwbuflen < 1) {
+		if (pwbuflen == -1 && errno == 0) {
+			pwbuflen = 1024;
+		} else if (pwbuflen < 1) {
 			return FAILURE;
 		}
 
 		pwbuf = emalloc(pwbuflen);
-		if (getpwnam_r(name, &pw, pwbuf, pwbuflen, &retpwptr) != 0 || retpwptr == NULL) {
+try_again:
+		retpwptr = &pw;
+		if (getpwnam_r(name, &pw, pwbuf, pwbuflen, &retpwptr) || retpwptr == NULL) {
+			if (errno == ERANGE) {
+				pwbuflen *= 2;
+				pwbuf = erealloc(pwbuf, pwbuflen);
+				goto try_again;
+			}
 			efree(pwbuf);
 			return FAILURE;
 		}
--- php-7.4.4/main/fopen_wrappers.c	2020-03-17 10:40:21.000000000 +0000
+++ php-7.4.4/main/fopen_wrappers.c	2020-03-27 04:08:46.553487201 +0000
@@ -366,10 +366,13 @@ PHPAPI int php_fopen_primary_script(zend
 			struct passwd *pw;
 #if defined(ZTS) && defined(HAVE_GETPWNAM_R) && defined(_SC_GETPW_R_SIZE_MAX)
 			struct passwd pwstruc;
+			errno = 0;
 			long pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
 			char *pwbuf;
 
-			if (pwbuflen < 1) {
+			if (pwbuflen == -1 && errno == 0) {
+				pwbuflen = 1024;
+			} else if (pwbuflen < 1) {
 				return FAILURE;
 			}
 
@@ -382,7 +385,14 @@ PHPAPI int php_fopen_primary_script(zend
 			memcpy(user, path_info + 2, length);
 			user[length] = '\0';
 #if defined(ZTS) && defined(HAVE_GETPWNAM_R) && defined(_SC_GETPW_R_SIZE_MAX)
-			if (getpwnam_r(user, &pwstruc, pwbuf, pwbuflen, &pw)) {
+try_again:
+			pw = &pwstruc;
+			if (getpwnam_r(user, pw, pwbuf, pwbuflen, &pw) || pw == NULL) {
+				if (errno == ERANGE) {
+					pwbuflen *= 2;
+					pwbuf = erealloc(pwbuf, pwbuflen);
+					goto try_again;
+				}
 				efree(pwbuf);
 				return FAILURE;
 			}
--- php-7.4.4/main/main.c	2020-03-17 10:40:21.000000000 +0000
+++ php-7.4.4/main/main.c	2020-03-27 03:33:22.663453619 +0000
@@ -1487,23 +1487,27 @@ PHPAPI char *php_get_current_user(void)
 		struct passwd *pwd;
 #if defined(ZTS) && defined(HAVE_GETPWUID_R) && defined(_SC_GETPW_R_SIZE_MAX)
 		struct passwd _pw;
-		struct passwd *retpwptr = NULL;
+		errno = 0;
 		int pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
 		char *pwbuf;
 
-		if (pwbuflen < 1) {
+		if (pwbuflen == -1 && errno == 0) {
+			pwbuflen = 1024;
+		} else if (pwbuflen < 1) {
 			return "";
 		}
 		pwbuf = emalloc(pwbuflen);
-		if (getpwuid_r(pstat->st_uid, &_pw, pwbuf, pwbuflen, &retpwptr) != 0) {
-			efree(pwbuf);
-			return "";
-		}
-		if (retpwptr == NULL) {
+try_again:
+		pwd = &_pw;
+		if (getpwuid_r(pstat->st_uid, pwd, pwbuf, pwbuflen, &pwd) || pwd == NULL) {
+			if (errno == ERANGE) {
+				pwbuflen *= 2;
+				pwbuf = erealloc(pwbuf, pwbuflen);
+				goto try_again;
+			}
 			efree(pwbuf);
 			return "";
 		}
-		pwd = &_pw;
 #else
 		if ((pwd=getpwuid(pstat->st_uid))==NULL) {
 			return "";