[php-src] master: Merge branch 'PHP-8.3'
| From: | Arnaud Le Blanc | Date: | Thu, 11 Apr 2024 11:33:48 +0000 |
| Subject: | [php-src] master: Merge branch 'PHP-8.3' | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-128072@lists.php.net to get a copy of this message | ||
Author: Arnaud Le Blanc (arnaud-lb)
Date: 2024-04-11T13:32:17+02:00
Commit: https://github.com/php/php-src/commit/47f0a06d3464e997cf70ad4ec81b7b559fe25a5d
Raw diff: https://github.com/php/php-src/commit/47f0a06d3464e997cf70ad4ec81b7b559fe25a5d.diff
Merge branch 'PHP-8.3'
* PHP-8.3:
[ci skip] NEWS
[ci skip] NEWS
Fix usage of reentrant functions in ext/posix (#13921)
Changed paths:
M ext/posix/posix.c
Diff:
diff --git a/ext/posix/posix.c b/ext/posix/posix.c
index 787b18ae2812..c0231b471788 100644
--- a/ext/posix/posix.c
+++ b/ext/posix/posix.c
@@ -451,6 +451,7 @@ PHP_FUNCTION(posix_ttyname)
zend_long fd = 0;
#if defined(ZTS) && defined(HAVE_TTYNAME_R) && defined(_SC_TTY_NAME_MAX)
zend_long buflen;
+ int err;
#endif
ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -476,12 +477,23 @@ PHP_FUNCTION(posix_ttyname)
#if defined(ZTS) && defined(HAVE_TTYNAME_R) && defined(_SC_TTY_NAME_MAX)
buflen = sysconf(_SC_TTY_NAME_MAX);
if (buflen < 1) {
- RETURN_FALSE;
+ buflen = 32;
}
+#if ZEND_DEBUG
+ /* Test retry logic */
+ buflen = 1;
+#endif
p = emalloc(buflen);
- if (ttyname_r(fd, p, buflen)) {
- POSIX_G(last_error) = errno;
+try_again:
+ err = ttyname_r(fd, p, buflen);
+ if (err) {
+ if (err == ERANGE) {
+ buflen *= 2;
+ p = erealloc(p, buflen);
+ goto try_again;
+ }
+ POSIX_G(last_error) = err;
efree(p);
RETURN_FALSE;
}
@@ -776,6 +788,7 @@ PHP_FUNCTION(posix_getgrnam)
struct group gbuf;
long buflen;
char *buf;
+ int err;
#endif
ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -785,19 +798,24 @@ PHP_FUNCTION(posix_getgrnam)
#if defined(ZTS) && defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX)
buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
if (buflen < 1) {
- RETURN_FALSE;
+ buflen = 1024;
}
+#if ZEND_DEBUG
+ /* Test retry logic */
+ buflen = 1;
+#endif
buf = emalloc(buflen);
try_again:
g = &gbuf;
- if (getgrnam_r(name, g, buf, buflen, &g) || g == NULL) {
- if (errno == ERANGE) {
+ err = getgrnam_r(name, g, buf, buflen, &g);
+ if (err || g == NULL) {
+ if (err == ERANGE) {
buflen *= 2;
buf = erealloc(buf, buflen);
goto try_again;
}
- POSIX_G(last_error) = errno;
+ POSIX_G(last_error) = err;
efree(buf);
RETURN_FALSE;
}
@@ -825,7 +843,7 @@ PHP_FUNCTION(posix_getgrgid)
{
zend_long gid;
#if defined(ZTS) && defined(HAVE_GETGRGID_R) && defined(_SC_GETGR_R_SIZE_MAX)
- int ret;
+ int err;
struct group _g;
struct group *retgrptr = NULL;
long grbuflen;
@@ -841,20 +859,24 @@ PHP_FUNCTION(posix_getgrgid)
grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
if (grbuflen < 1) {
- RETURN_FALSE;
+ grbuflen = 1024;
}
+#if ZEND_DEBUG
+ /* Test retry logic */
+ grbuflen = 1;
+#endif
grbuf = emalloc(grbuflen);
try_again:
- ret = getgrgid_r(gid, &_g, grbuf, grbuflen, &retgrptr);
- if (ret || retgrptr == NULL) {
- if (errno == ERANGE) {
+ err = getgrgid_r(gid, &_g, grbuf, grbuflen, &retgrptr);
+ if (err || retgrptr == NULL) {
+ if (err == ERANGE) {
grbuflen *= 2;
grbuf = erealloc(grbuf, grbuflen);
goto try_again;
}
- POSIX_G(last_error) = ret;
+ POSIX_G(last_error) = err;
efree(grbuf);
RETURN_FALSE;
}
@@ -906,6 +928,7 @@ PHP_FUNCTION(posix_getpwnam)
struct passwd pwbuf;
long buflen;
char *buf;
+ int err;
#endif
ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -915,20 +938,25 @@ PHP_FUNCTION(posix_getpwnam)
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWNAM_R)
buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
if (buflen < 1) {
- RETURN_FALSE;
+ buflen = 1024;
}
+#if ZEND_DEBUG
+ /* Test retry logic */
+ buflen = 1;
+#endif
buf = emalloc(buflen);
- pw = &pwbuf;
try_again:
- if (getpwnam_r(name, pw, buf, buflen, &pw) || pw == NULL) {
- if (errno == ERANGE) {
+ pw = &pwbuf;
+ err = getpwnam_r(name, pw, buf, buflen, &pw);
+ if (err || pw == NULL) {
+ if (err == ERANGE) {
buflen *= 2;
buf = erealloc(buf, buflen);
goto try_again;
}
efree(buf);
- POSIX_G(last_error) = errno;
+ POSIX_G(last_error) = err;
RETURN_FALSE;
}
#else
@@ -959,7 +987,7 @@ PHP_FUNCTION(posix_getpwuid)
struct passwd *retpwptr = NULL;
long pwbuflen;
char *pwbuf;
- int ret;
+ int err;
#endif
struct passwd *pw;
@@ -970,19 +998,23 @@ PHP_FUNCTION(posix_getpwuid)
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R)
pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
if (pwbuflen < 1) {
- RETURN_FALSE;
+ pwbuflen = 1024;
}
+#if ZEND_DEBUG
+ /* Test retry logic */
+ pwbuflen = 1;
+#endif
pwbuf = emalloc(pwbuflen);
try_again:
- ret = getpwuid_r(uid, &_pw, pwbuf, pwbuflen, &retpwptr);
- if (ret || retpwptr == NULL) {
+ err = getpwuid_r(uid, &_pw, pwbuf, pwbuflen, &retpwptr);
+ if (err || retpwptr == NULL) {
if (errno == ERANGE) {
pwbuflen *= 2;
pwbuf = erealloc(pwbuf, pwbuflen);
goto try_again;
}
- POSIX_G(last_error) = ret;
+ POSIX_G(last_error) = err;
efree(pwbuf);
RETURN_FALSE;
}