diff options
Diffstat (limited to 'user/php7/no-max-ent-size.patch')
-rw-r--r-- | user/php7/no-max-ent-size.patch | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/user/php7/no-max-ent-size.patch b/user/php7/no-max-ent-size.patch new file mode 100644 index 000000000..7f28ba3f1 --- /dev/null +++ b/user/php7/no-max-ent-size.patch @@ -0,0 +1,257 @@ +--- 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 ""; |