@@ -2774,8 +2774,16 @@ PHP_FUNCTION(socket_addrinfo_lookup)
2774
2774
zend_argument_type_error (3 , "\"ai_family\" key must be of type int, %s given" , zend_zval_type_name (hint ));
2775
2775
RETURN_THROWS ();
2776
2776
}
2777
- if (val < 0 || val >= AF_MAX ) {
2778
- zend_argument_value_error (3 , "\"ai_family\" key must be between 0 and %d" , AF_MAX - 1 );
2777
+ // Some platforms support also PF_LOCAL/AF_UNIX (e.g. FreeBSD) but the security concerns implied
2778
+ // make it not worth handling it (e.g. unwarranted write permissions on the socket).
2779
+ // Note existing socket_addrinfo* api already forbid such case.
2780
+ #ifdef HAVE_IPV6
2781
+ if (val != AF_INET && val != AF_INET6 ) {
2782
+ zend_argument_value_error (3 , "\"ai_family\" key must be AF_INET or AF_INET6" );
2783
+ #else
2784
+ if (val != AF_INET ) {
2785
+ zend_argument_value_error (3 , "\"ai_family\" key must be AF_INET" );
2786
+ #endif
2779
2787
RETURN_THROWS ();
2780
2788
}
2781
2789
hints .ai_family = (int )val ;
@@ -2827,7 +2835,6 @@ PHP_FUNCTION(socket_addrinfo_lookup)
2827
2835
PHP_FUNCTION (socket_addrinfo_bind )
2828
2836
{
2829
2837
zval * arg1 ;
2830
- int retval ;
2831
2838
php_addrinfo * ai ;
2832
2839
php_socket * php_sock ;
2833
2840
@@ -2837,6 +2844,8 @@ PHP_FUNCTION(socket_addrinfo_bind)
2837
2844
2838
2845
ai = Z_ADDRESS_INFO_P (arg1 );
2839
2846
2847
+ ZEND_ASSERT (ai -> addrinfo .ai_family == AF_INET || ai -> addrinfo .ai_family == AF_INET6 );
2848
+
2840
2849
PHP_ETH_PROTO_CHECK (ai -> addrinfo .ai_protocol , ai -> addrinfo .ai_family );
2841
2850
2842
2851
object_init_ex (return_value , socket_ce );
@@ -2855,31 +2864,7 @@ PHP_FUNCTION(socket_addrinfo_bind)
2855
2864
php_sock -> error = 0 ;
2856
2865
php_sock -> blocking = 1 ;
2857
2866
2858
- switch (php_sock -> type ) {
2859
- case AF_UNIX :
2860
- {
2861
- // AF_UNIX sockets via getaddrino are not implemented due to security problems
2862
- close (php_sock -> bsd_socket );
2863
- zval_ptr_dtor (return_value );
2864
- RETURN_FALSE ;
2865
- }
2866
-
2867
- case AF_INET :
2868
- #ifdef HAVE_IPV6
2869
- case AF_INET6 :
2870
- #endif
2871
- {
2872
- retval = bind (php_sock -> bsd_socket , ai -> addrinfo .ai_addr , ai -> addrinfo .ai_addrlen );
2873
- break ;
2874
- }
2875
- default :
2876
- close (php_sock -> bsd_socket );
2877
- zval_ptr_dtor (return_value );
2878
- zend_argument_value_error (1 , "must be one of AF_UNIX, AF_INET, or AF_INET6" );
2879
- RETURN_THROWS ();
2880
- }
2881
-
2882
- if (retval != 0 ) {
2867
+ if (bind (php_sock -> bsd_socket , ai -> addrinfo .ai_addr , ai -> addrinfo .ai_addrlen ) != 0 ) {
2883
2868
PHP_SOCKET_ERROR (php_sock , "Unable to bind address" , errno );
2884
2869
close (php_sock -> bsd_socket );
2885
2870
zval_ptr_dtor (return_value );
@@ -2892,7 +2877,6 @@ PHP_FUNCTION(socket_addrinfo_bind)
2892
2877
PHP_FUNCTION (socket_addrinfo_connect )
2893
2878
{
2894
2879
zval * arg1 ;
2895
- int retval ;
2896
2880
php_addrinfo * ai ;
2897
2881
php_socket * php_sock ;
2898
2882
@@ -2902,6 +2886,8 @@ PHP_FUNCTION(socket_addrinfo_connect)
2902
2886
2903
2887
ai = Z_ADDRESS_INFO_P (arg1 );
2904
2888
2889
+ ZEND_ASSERT (ai -> addrinfo .ai_family == AF_INET || ai -> addrinfo .ai_family == AF_INET6 );
2890
+
2905
2891
PHP_ETH_PROTO_CHECK (ai -> addrinfo .ai_protocol , ai -> addrinfo .ai_family );
2906
2892
2907
2893
object_init_ex (return_value , socket_ce );
@@ -2920,31 +2906,7 @@ PHP_FUNCTION(socket_addrinfo_connect)
2920
2906
php_sock -> error = 0 ;
2921
2907
php_sock -> blocking = 1 ;
2922
2908
2923
- switch (php_sock -> type ) {
2924
- case AF_UNIX :
2925
- {
2926
- // AF_UNIX sockets via getaddrino are not implemented due to security problems
2927
- close (php_sock -> bsd_socket );
2928
- zval_ptr_dtor (return_value );
2929
- RETURN_FALSE ;
2930
- }
2931
-
2932
- case AF_INET :
2933
- #ifdef HAVE_IPV6
2934
- case AF_INET6 :
2935
- #endif
2936
- {
2937
- retval = connect (php_sock -> bsd_socket , ai -> addrinfo .ai_addr , ai -> addrinfo .ai_addrlen );
2938
- break ;
2939
- }
2940
- default :
2941
- zend_argument_value_error (1 , "socket type must be one of AF_UNIX, AF_INET, or AF_INET6" );
2942
- close (php_sock -> bsd_socket );
2943
- zval_ptr_dtor (return_value );
2944
- RETURN_THROWS ();
2945
- }
2946
-
2947
- if (retval != 0 ) {
2909
+ if (connect (php_sock -> bsd_socket , ai -> addrinfo .ai_addr , ai -> addrinfo .ai_addrlen ) != 0 ) {
2948
2910
PHP_SOCKET_ERROR (php_sock , "Unable to connect address" , errno );
2949
2911
close (php_sock -> bsd_socket );
2950
2912
zval_ptr_dtor (return_value );
0 commit comments