Skip to content

Commit d986b5c

Browse files
committed
Merge branch 'PHP-8.2' into PHP-8.3
* PHP-8.2: [ci skip] NEWS Fix usage of reentrant functions in ext/posix (#13921)
2 parents 639a0d7 + ed84bcd commit d986b5c

File tree

1 file changed

+55
-23
lines changed

1 file changed

+55
-23
lines changed

ext/posix/posix.c

+55-23
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ PHP_FUNCTION(posix_ttyname)
452452
zend_long fd = 0;
453453
#if defined(ZTS) && defined(HAVE_TTYNAME_R) && defined(_SC_TTY_NAME_MAX)
454454
zend_long buflen;
455+
int err;
455456
#endif
456457

457458
ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -477,12 +478,23 @@ PHP_FUNCTION(posix_ttyname)
477478
#if defined(ZTS) && defined(HAVE_TTYNAME_R) && defined(_SC_TTY_NAME_MAX)
478479
buflen = sysconf(_SC_TTY_NAME_MAX);
479480
if (buflen < 1) {
480-
RETURN_FALSE;
481+
buflen = 32;
481482
}
483+
#if ZEND_DEBUG
484+
/* Test retry logic */
485+
buflen = 1;
486+
#endif
482487
p = emalloc(buflen);
483488

484-
if (ttyname_r(fd, p, buflen)) {
485-
POSIX_G(last_error) = errno;
489+
try_again:
490+
err = ttyname_r(fd, p, buflen);
491+
if (err) {
492+
if (err == ERANGE) {
493+
buflen *= 2;
494+
p = erealloc(p, buflen);
495+
goto try_again;
496+
}
497+
POSIX_G(last_error) = err;
486498
efree(p);
487499
RETURN_FALSE;
488500
}
@@ -775,6 +787,7 @@ PHP_FUNCTION(posix_getgrnam)
775787
struct group gbuf;
776788
long buflen;
777789
char *buf;
790+
int err;
778791
#endif
779792

780793
ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -784,19 +797,24 @@ PHP_FUNCTION(posix_getgrnam)
784797
#if defined(ZTS) && defined(HAVE_GETGRNAM_R) && defined(_SC_GETGR_R_SIZE_MAX)
785798
buflen = sysconf(_SC_GETGR_R_SIZE_MAX);
786799
if (buflen < 1) {
787-
RETURN_FALSE;
800+
buflen = 1024;
788801
}
802+
#if ZEND_DEBUG
803+
/* Test retry logic */
804+
buflen = 1;
805+
#endif
789806
buf = emalloc(buflen);
790807
try_again:
791808
g = &gbuf;
792809

793-
if (getgrnam_r(name, g, buf, buflen, &g) || g == NULL) {
794-
if (errno == ERANGE) {
810+
err = getgrnam_r(name, g, buf, buflen, &g);
811+
if (err || g == NULL) {
812+
if (err == ERANGE) {
795813
buflen *= 2;
796814
buf = erealloc(buf, buflen);
797815
goto try_again;
798816
}
799-
POSIX_G(last_error) = errno;
817+
POSIX_G(last_error) = err;
800818
efree(buf);
801819
RETURN_FALSE;
802820
}
@@ -824,7 +842,7 @@ PHP_FUNCTION(posix_getgrgid)
824842
{
825843
zend_long gid;
826844
#if defined(ZTS) && defined(HAVE_GETGRGID_R) && defined(_SC_GETGR_R_SIZE_MAX)
827-
int ret;
845+
int err;
828846
struct group _g;
829847
struct group *retgrptr = NULL;
830848
long grbuflen;
@@ -840,20 +858,24 @@ PHP_FUNCTION(posix_getgrgid)
840858

841859
grbuflen = sysconf(_SC_GETGR_R_SIZE_MAX);
842860
if (grbuflen < 1) {
843-
RETURN_FALSE;
861+
grbuflen = 1024;
844862
}
863+
#if ZEND_DEBUG
864+
/* Test retry logic */
865+
grbuflen = 1;
866+
#endif
845867

846868
grbuf = emalloc(grbuflen);
847869

848870
try_again:
849-
ret = getgrgid_r(gid, &_g, grbuf, grbuflen, &retgrptr);
850-
if (ret || retgrptr == NULL) {
851-
if (errno == ERANGE) {
871+
err = getgrgid_r(gid, &_g, grbuf, grbuflen, &retgrptr);
872+
if (err || retgrptr == NULL) {
873+
if (err == ERANGE) {
852874
grbuflen *= 2;
853875
grbuf = erealloc(grbuf, grbuflen);
854876
goto try_again;
855877
}
856-
POSIX_G(last_error) = ret;
878+
POSIX_G(last_error) = err;
857879
efree(grbuf);
858880
RETURN_FALSE;
859881
}
@@ -905,6 +927,7 @@ PHP_FUNCTION(posix_getpwnam)
905927
struct passwd pwbuf;
906928
long buflen;
907929
char *buf;
930+
int err;
908931
#endif
909932

910933
ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -914,20 +937,25 @@ PHP_FUNCTION(posix_getpwnam)
914937
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWNAM_R)
915938
buflen = sysconf(_SC_GETPW_R_SIZE_MAX);
916939
if (buflen < 1) {
917-
RETURN_FALSE;
940+
buflen = 1024;
918941
}
942+
#if ZEND_DEBUG
943+
/* Test retry logic */
944+
buflen = 1;
945+
#endif
919946
buf = emalloc(buflen);
920-
pw = &pwbuf;
921947

922948
try_again:
923-
if (getpwnam_r(name, pw, buf, buflen, &pw) || pw == NULL) {
924-
if (errno == ERANGE) {
949+
pw = &pwbuf;
950+
err = getpwnam_r(name, pw, buf, buflen, &pw);
951+
if (err || pw == NULL) {
952+
if (err == ERANGE) {
925953
buflen *= 2;
926954
buf = erealloc(buf, buflen);
927955
goto try_again;
928956
}
929957
efree(buf);
930-
POSIX_G(last_error) = errno;
958+
POSIX_G(last_error) = err;
931959
RETURN_FALSE;
932960
}
933961
#else
@@ -958,7 +986,7 @@ PHP_FUNCTION(posix_getpwuid)
958986
struct passwd *retpwptr = NULL;
959987
long pwbuflen;
960988
char *pwbuf;
961-
int ret;
989+
int err;
962990
#endif
963991
struct passwd *pw;
964992

@@ -969,19 +997,23 @@ PHP_FUNCTION(posix_getpwuid)
969997
#if defined(ZTS) && defined(_SC_GETPW_R_SIZE_MAX) && defined(HAVE_GETPWUID_R)
970998
pwbuflen = sysconf(_SC_GETPW_R_SIZE_MAX);
971999
if (pwbuflen < 1) {
972-
RETURN_FALSE;
1000+
pwbuflen = 1024;
9731001
}
1002+
#if ZEND_DEBUG
1003+
/* Test retry logic */
1004+
pwbuflen = 1;
1005+
#endif
9741006
pwbuf = emalloc(pwbuflen);
9751007

9761008
try_again:
977-
ret = getpwuid_r(uid, &_pw, pwbuf, pwbuflen, &retpwptr);
978-
if (ret || retpwptr == NULL) {
1009+
err = getpwuid_r(uid, &_pw, pwbuf, pwbuflen, &retpwptr);
1010+
if (err || retpwptr == NULL) {
9791011
if (errno == ERANGE) {
9801012
pwbuflen *= 2;
9811013
pwbuf = erealloc(pwbuf, pwbuflen);
9821014
goto try_again;
9831015
}
984-
POSIX_G(last_error) = ret;
1016+
POSIX_G(last_error) = err;
9851017
efree(pwbuf);
9861018
RETURN_FALSE;
9871019
}

0 commit comments

Comments
 (0)