@@ -451,6 +451,7 @@ PHP_FUNCTION(posix_ttyname)
451
451
zend_long fd = 0 ;
452
452
#if defined(ZTS ) && defined(HAVE_TTYNAME_R ) && defined(_SC_TTY_NAME_MAX )
453
453
zend_long buflen ;
454
+ int err ;
454
455
#endif
455
456
456
457
ZEND_PARSE_PARAMETERS_START (1 , 1 )
@@ -476,12 +477,23 @@ PHP_FUNCTION(posix_ttyname)
476
477
#if defined(ZTS ) && defined(HAVE_TTYNAME_R ) && defined(_SC_TTY_NAME_MAX )
477
478
buflen = sysconf (_SC_TTY_NAME_MAX );
478
479
if (buflen < 1 ) {
479
- RETURN_FALSE ;
480
+ buflen = 32 ;
480
481
}
482
+ #if ZEND_DEBUG
483
+ /* Test retry logic */
484
+ buflen = 1 ;
485
+ #endif
481
486
p = emalloc (buflen );
482
487
483
- if (ttyname_r (fd , p , buflen )) {
484
- POSIX_G (last_error ) = errno ;
488
+ try_again :
489
+ err = ttyname_r (fd , p , buflen );
490
+ if (err ) {
491
+ if (err == ERANGE ) {
492
+ buflen *= 2 ;
493
+ p = erealloc (p , buflen );
494
+ goto try_again ;
495
+ }
496
+ POSIX_G (last_error ) = err ;
485
497
efree (p );
486
498
RETURN_FALSE ;
487
499
}
@@ -776,6 +788,7 @@ PHP_FUNCTION(posix_getgrnam)
776
788
struct group gbuf ;
777
789
long buflen ;
778
790
char * buf ;
791
+ int err ;
779
792
#endif
780
793
781
794
ZEND_PARSE_PARAMETERS_START (1 , 1 )
@@ -785,19 +798,24 @@ PHP_FUNCTION(posix_getgrnam)
785
798
#if defined(ZTS ) && defined(HAVE_GETGRNAM_R ) && defined(_SC_GETGR_R_SIZE_MAX )
786
799
buflen = sysconf (_SC_GETGR_R_SIZE_MAX );
787
800
if (buflen < 1 ) {
788
- RETURN_FALSE ;
801
+ buflen = 1024 ;
789
802
}
803
+ #if ZEND_DEBUG
804
+ /* Test retry logic */
805
+ buflen = 1 ;
806
+ #endif
790
807
buf = emalloc (buflen );
791
808
try_again :
792
809
g = & gbuf ;
793
810
794
- if (getgrnam_r (name , g , buf , buflen , & g ) || g == NULL ) {
795
- if (errno == ERANGE ) {
811
+ err = getgrnam_r (name , g , buf , buflen , & g );
812
+ if (err || g == NULL ) {
813
+ if (err == ERANGE ) {
796
814
buflen *= 2 ;
797
815
buf = erealloc (buf , buflen );
798
816
goto try_again ;
799
817
}
800
- POSIX_G (last_error ) = errno ;
818
+ POSIX_G (last_error ) = err ;
801
819
efree (buf );
802
820
RETURN_FALSE ;
803
821
}
@@ -825,7 +843,7 @@ PHP_FUNCTION(posix_getgrgid)
825
843
{
826
844
zend_long gid ;
827
845
#if defined(ZTS ) && defined(HAVE_GETGRGID_R ) && defined(_SC_GETGR_R_SIZE_MAX )
828
- int ret ;
846
+ int err ;
829
847
struct group _g ;
830
848
struct group * retgrptr = NULL ;
831
849
long grbuflen ;
@@ -841,20 +859,24 @@ PHP_FUNCTION(posix_getgrgid)
841
859
842
860
grbuflen = sysconf (_SC_GETGR_R_SIZE_MAX );
843
861
if (grbuflen < 1 ) {
844
- RETURN_FALSE ;
862
+ grbuflen = 1024 ;
845
863
}
864
+ #if ZEND_DEBUG
865
+ /* Test retry logic */
866
+ grbuflen = 1 ;
867
+ #endif
846
868
847
869
grbuf = emalloc (grbuflen );
848
870
849
871
try_again :
850
- ret = getgrgid_r (gid , & _g , grbuf , grbuflen , & retgrptr );
851
- if (ret || retgrptr == NULL ) {
852
- if (errno == ERANGE ) {
872
+ err = getgrgid_r (gid , & _g , grbuf , grbuflen , & retgrptr );
873
+ if (err || retgrptr == NULL ) {
874
+ if (err == ERANGE ) {
853
875
grbuflen *= 2 ;
854
876
grbuf = erealloc (grbuf , grbuflen );
855
877
goto try_again ;
856
878
}
857
- POSIX_G (last_error ) = ret ;
879
+ POSIX_G (last_error ) = err ;
858
880
efree (grbuf );
859
881
RETURN_FALSE ;
860
882
}
@@ -906,6 +928,7 @@ PHP_FUNCTION(posix_getpwnam)
906
928
struct passwd pwbuf ;
907
929
long buflen ;
908
930
char * buf ;
931
+ int err ;
909
932
#endif
910
933
911
934
ZEND_PARSE_PARAMETERS_START (1 , 1 )
@@ -915,20 +938,25 @@ PHP_FUNCTION(posix_getpwnam)
915
938
#if defined(ZTS ) && defined(_SC_GETPW_R_SIZE_MAX ) && defined(HAVE_GETPWNAM_R )
916
939
buflen = sysconf (_SC_GETPW_R_SIZE_MAX );
917
940
if (buflen < 1 ) {
918
- RETURN_FALSE ;
941
+ buflen = 1024 ;
919
942
}
943
+ #if ZEND_DEBUG
944
+ /* Test retry logic */
945
+ buflen = 1 ;
946
+ #endif
920
947
buf = emalloc (buflen );
921
- pw = & pwbuf ;
922
948
923
949
try_again :
924
- if (getpwnam_r (name , pw , buf , buflen , & pw ) || pw == NULL ) {
925
- if (errno == ERANGE ) {
950
+ pw = & pwbuf ;
951
+ err = getpwnam_r (name , pw , buf , buflen , & pw );
952
+ if (err || pw == NULL ) {
953
+ if (err == ERANGE ) {
926
954
buflen *= 2 ;
927
955
buf = erealloc (buf , buflen );
928
956
goto try_again ;
929
957
}
930
958
efree (buf );
931
- POSIX_G (last_error ) = errno ;
959
+ POSIX_G (last_error ) = err ;
932
960
RETURN_FALSE ;
933
961
}
934
962
#else
@@ -959,7 +987,7 @@ PHP_FUNCTION(posix_getpwuid)
959
987
struct passwd * retpwptr = NULL ;
960
988
long pwbuflen ;
961
989
char * pwbuf ;
962
- int ret ;
990
+ int err ;
963
991
#endif
964
992
struct passwd * pw ;
965
993
@@ -970,19 +998,23 @@ PHP_FUNCTION(posix_getpwuid)
970
998
#if defined(ZTS ) && defined(_SC_GETPW_R_SIZE_MAX ) && defined(HAVE_GETPWUID_R )
971
999
pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX );
972
1000
if (pwbuflen < 1 ) {
973
- RETURN_FALSE ;
1001
+ pwbuflen = 1024 ;
974
1002
}
1003
+ #if ZEND_DEBUG
1004
+ /* Test retry logic */
1005
+ pwbuflen = 1 ;
1006
+ #endif
975
1007
pwbuf = emalloc (pwbuflen );
976
1008
977
1009
try_again :
978
- ret = getpwuid_r (uid , & _pw , pwbuf , pwbuflen , & retpwptr );
979
- if (ret || retpwptr == NULL ) {
1010
+ err = getpwuid_r (uid , & _pw , pwbuf , pwbuflen , & retpwptr );
1011
+ if (err || retpwptr == NULL ) {
980
1012
if (errno == ERANGE ) {
981
1013
pwbuflen *= 2 ;
982
1014
pwbuf = erealloc (pwbuf , pwbuflen );
983
1015
goto try_again ;
984
1016
}
985
- POSIX_G (last_error ) = ret ;
1017
+ POSIX_G (last_error ) = err ;
986
1018
efree (pwbuf );
987
1019
RETURN_FALSE ;
988
1020
}
0 commit comments