@@ -447,6 +447,7 @@ PHP_FUNCTION(posix_ttyname)
447
447
int fd ;
448
448
#if defined(ZTS ) && defined(HAVE_TTYNAME_R ) && defined(_SC_TTY_NAME_MAX )
449
449
zend_long buflen ;
450
+ int err ;
450
451
#endif
451
452
452
453
ZEND_PARSE_PARAMETERS_START (1 , 1 )
@@ -465,12 +466,23 @@ PHP_FUNCTION(posix_ttyname)
465
466
#if defined(ZTS ) && defined(HAVE_TTYNAME_R ) && defined(_SC_TTY_NAME_MAX )
466
467
buflen = sysconf (_SC_TTY_NAME_MAX );
467
468
if (buflen < 1 ) {
468
- RETURN_FALSE ;
469
+ buflen = 32 ;
469
470
}
471
+ #if ZEND_DEBUG
472
+ /* Test retry logic */
473
+ buflen = 1 ;
474
+ #endif
470
475
p = emalloc (buflen );
471
476
472
- if (ttyname_r (fd , p , buflen )) {
473
- POSIX_G (last_error ) = errno ;
477
+ try_again :
478
+ err = ttyname_r (fd , p , buflen );
479
+ if (err ) {
480
+ if (err == ERANGE ) {
481
+ buflen *= 2 ;
482
+ p = erealloc (p , buflen );
483
+ goto try_again ;
484
+ }
485
+ POSIX_G (last_error ) = err ;
474
486
efree (p );
475
487
RETURN_FALSE ;
476
488
}
@@ -719,6 +731,7 @@ PHP_FUNCTION(posix_getgrnam)
719
731
struct group gbuf ;
720
732
long buflen ;
721
733
char * buf ;
734
+ int err ;
722
735
#endif
723
736
724
737
ZEND_PARSE_PARAMETERS_START (1 , 1 )
@@ -728,19 +741,24 @@ PHP_FUNCTION(posix_getgrnam)
728
741
#if defined(ZTS ) && defined(HAVE_GETGRNAM_R ) && defined(_SC_GETGR_R_SIZE_MAX )
729
742
buflen = sysconf (_SC_GETGR_R_SIZE_MAX );
730
743
if (buflen < 1 ) {
731
- RETURN_FALSE ;
744
+ buflen = 1024 ;
732
745
}
746
+ #if ZEND_DEBUG
747
+ /* Test retry logic */
748
+ buflen = 1 ;
749
+ #endif
733
750
buf = emalloc (buflen );
734
751
try_again :
735
752
g = & gbuf ;
736
753
737
- if (getgrnam_r (name , g , buf , buflen , & g ) || g == NULL ) {
738
- if (errno == ERANGE ) {
754
+ err = getgrnam_r (name , g , buf , buflen , & g );
755
+ if (err || g == NULL ) {
756
+ if (err == ERANGE ) {
739
757
buflen *= 2 ;
740
758
buf = erealloc (buf , buflen );
741
759
goto try_again ;
742
760
}
743
- POSIX_G (last_error ) = errno ;
761
+ POSIX_G (last_error ) = err ;
744
762
efree (buf );
745
763
RETURN_FALSE ;
746
764
}
@@ -768,7 +786,7 @@ PHP_FUNCTION(posix_getgrgid)
768
786
{
769
787
zend_long gid ;
770
788
#if defined(ZTS ) && defined(HAVE_GETGRGID_R ) && defined(_SC_GETGR_R_SIZE_MAX )
771
- int ret ;
789
+ int err ;
772
790
struct group _g ;
773
791
struct group * retgrptr = NULL ;
774
792
long grbuflen ;
@@ -784,20 +802,24 @@ PHP_FUNCTION(posix_getgrgid)
784
802
785
803
grbuflen = sysconf (_SC_GETGR_R_SIZE_MAX );
786
804
if (grbuflen < 1 ) {
787
- RETURN_FALSE ;
805
+ grbuflen = 1024 ;
788
806
}
807
+ #if ZEND_DEBUG
808
+ /* Test retry logic */
809
+ grbuflen = 1 ;
810
+ #endif
789
811
790
812
grbuf = emalloc (grbuflen );
791
813
792
814
try_again :
793
- ret = getgrgid_r (gid , & _g , grbuf , grbuflen , & retgrptr );
794
- if (ret || retgrptr == NULL ) {
795
- if (errno == ERANGE ) {
815
+ err = getgrgid_r (gid , & _g , grbuf , grbuflen , & retgrptr );
816
+ if (err || retgrptr == NULL ) {
817
+ if (err == ERANGE ) {
796
818
grbuflen *= 2 ;
797
819
grbuf = erealloc (grbuf , grbuflen );
798
820
goto try_again ;
799
821
}
800
- POSIX_G (last_error ) = ret ;
822
+ POSIX_G (last_error ) = err ;
801
823
efree (grbuf );
802
824
RETURN_FALSE ;
803
825
}
@@ -849,6 +871,7 @@ PHP_FUNCTION(posix_getpwnam)
849
871
struct passwd pwbuf ;
850
872
long buflen ;
851
873
char * buf ;
874
+ int err ;
852
875
#endif
853
876
854
877
ZEND_PARSE_PARAMETERS_START (1 , 1 )
@@ -858,20 +881,25 @@ PHP_FUNCTION(posix_getpwnam)
858
881
#if defined(ZTS ) && defined(_SC_GETPW_R_SIZE_MAX ) && defined(HAVE_GETPWNAM_R )
859
882
buflen = sysconf (_SC_GETPW_R_SIZE_MAX );
860
883
if (buflen < 1 ) {
861
- RETURN_FALSE ;
884
+ buflen = 1024 ;
862
885
}
886
+ #if ZEND_DEBUG
887
+ /* Test retry logic */
888
+ buflen = 1 ;
889
+ #endif
863
890
buf = emalloc (buflen );
864
- pw = & pwbuf ;
865
891
866
892
try_again :
867
- if (getpwnam_r (name , pw , buf , buflen , & pw ) || pw == NULL ) {
868
- if (errno == ERANGE ) {
893
+ pw = & pwbuf ;
894
+ err = getpwnam_r (name , pw , buf , buflen , & pw );
895
+ if (err || pw == NULL ) {
896
+ if (err == ERANGE ) {
869
897
buflen *= 2 ;
870
898
buf = erealloc (buf , buflen );
871
899
goto try_again ;
872
900
}
873
901
efree (buf );
874
- POSIX_G (last_error ) = errno ;
902
+ POSIX_G (last_error ) = err ;
875
903
RETURN_FALSE ;
876
904
}
877
905
#else
@@ -902,7 +930,7 @@ PHP_FUNCTION(posix_getpwuid)
902
930
struct passwd * retpwptr = NULL ;
903
931
long pwbuflen ;
904
932
char * pwbuf ;
905
- int ret ;
933
+ int err ;
906
934
#endif
907
935
struct passwd * pw ;
908
936
@@ -913,19 +941,23 @@ PHP_FUNCTION(posix_getpwuid)
913
941
#if defined(ZTS ) && defined(_SC_GETPW_R_SIZE_MAX ) && defined(HAVE_GETPWUID_R )
914
942
pwbuflen = sysconf (_SC_GETPW_R_SIZE_MAX );
915
943
if (pwbuflen < 1 ) {
916
- RETURN_FALSE ;
944
+ pwbuflen = 1024 ;
917
945
}
946
+ #if ZEND_DEBUG
947
+ /* Test retry logic */
948
+ pwbuflen = 1 ;
949
+ #endif
918
950
pwbuf = emalloc (pwbuflen );
919
951
920
952
try_again :
921
- ret = getpwuid_r (uid , & _pw , pwbuf , pwbuflen , & retpwptr );
922
- if (ret || retpwptr == NULL ) {
953
+ err = getpwuid_r (uid , & _pw , pwbuf , pwbuflen , & retpwptr );
954
+ if (err || retpwptr == NULL ) {
923
955
if (errno == ERANGE ) {
924
956
pwbuflen *= 2 ;
925
957
pwbuf = erealloc (pwbuf , pwbuflen );
926
958
goto try_again ;
927
959
}
928
- POSIX_G (last_error ) = ret ;
960
+ POSIX_G (last_error ) = err ;
929
961
efree (pwbuf );
930
962
RETURN_FALSE ;
931
963
}
0 commit comments