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