@@ -1930,8 +1930,16 @@ PHP_FUNCTION(socket_set_option)
1930
1930
const char l_onoff_key [] = "l_onoff" ;
1931
1931
const char l_linger_key [] = "l_linger" ;
1932
1932
1933
- convert_to_array (arg4 );
1934
- opt_ht = Z_ARRVAL_P (arg4 );
1933
+ if (Z_TYPE_P (arg4 ) != IS_ARRAY ) {
1934
+ if (UNEXPECTED (Z_TYPE_P (arg4 ) != IS_OBJECT )) {
1935
+ zend_argument_type_error (4 , "must be of type array when argument #3 ($option) is SO_LINGER, %s given" , zend_zval_value_name (arg4 ));
1936
+ RETURN_THROWS ();
1937
+ } else {
1938
+ opt_ht = Z_OBJPROP_P (arg4 );
1939
+ }
1940
+ } else {
1941
+ opt_ht = Z_ARRVAL_P (arg4 );
1942
+ }
1935
1943
1936
1944
if ((l_onoff = zend_hash_str_find (opt_ht , l_onoff_key , sizeof (l_onoff_key ) - 1 )) == NULL ) {
1937
1945
zend_argument_value_error (4 , "must have key \"%s\"" , l_onoff_key );
@@ -1942,11 +1950,21 @@ PHP_FUNCTION(socket_set_option)
1942
1950
RETURN_THROWS ();
1943
1951
}
1944
1952
1945
- convert_to_long (l_onoff );
1946
- convert_to_long (l_linger );
1953
+ zend_long val_lonoff = zval_get_long (l_onoff );
1954
+ zend_long val_linger = zval_get_long (l_linger );
1955
+
1956
+ if (val_lonoff < 0 || val_lonoff > USHRT_MAX ) {
1957
+ zend_argument_value_error (4 , "\"%s\" must be between 0 and %u" , l_onoff_key , USHRT_MAX );
1958
+ RETURN_THROWS ();
1959
+ }
1960
+
1961
+ if (val_linger < 0 || val_linger > USHRT_MAX ) {
1962
+ zend_argument_value_error (4 , "\"%s\" must be between 0 and %d" , l_linger , USHRT_MAX );
1963
+ RETURN_THROWS ();
1964
+ }
1947
1965
1948
- lv .l_onoff = (unsigned short )Z_LVAL_P ( l_onoff ) ;
1949
- lv .l_linger = (unsigned short )Z_LVAL_P ( l_linger ) ;
1966
+ lv .l_onoff = (unsigned short )val_lonoff ;
1967
+ lv .l_linger = (unsigned short )val_linger ;
1950
1968
1951
1969
optlen = sizeof (lv );
1952
1970
opt_ptr = & lv ;
@@ -1958,8 +1976,18 @@ PHP_FUNCTION(socket_set_option)
1958
1976
const char sec_key [] = "sec" ;
1959
1977
const char usec_key [] = "usec" ;
1960
1978
1961
- convert_to_array (arg4 );
1962
- opt_ht = Z_ARRVAL_P (arg4 );
1979
+ if (Z_TYPE_P (arg4 ) != IS_ARRAY ) {
1980
+ if (UNEXPECTED (Z_TYPE_P (arg4 ) != IS_OBJECT )) {
1981
+ zend_argument_type_error (4 , "must be of type array when argument #3 ($option) is %s, %s given" ,
1982
+ optname == SO_RCVTIMEO ? "SO_RCVTIMEO" : "SO_SNDTIMEO" ,
1983
+ zend_zval_value_name (arg4 ));
1984
+ RETURN_THROWS ();
1985
+ } else {
1986
+ opt_ht = Z_OBJPROP_P (arg4 );
1987
+ }
1988
+ } else {
1989
+ opt_ht = Z_ARRVAL_P (arg4 );
1990
+ }
1963
1991
1964
1992
if ((sec = zend_hash_str_find (opt_ht , sec_key , sizeof (sec_key ) - 1 )) == NULL ) {
1965
1993
zend_argument_value_error (4 , "must have key \"%s\"" , sec_key );
@@ -1970,15 +1998,16 @@ PHP_FUNCTION(socket_set_option)
1970
1998
RETURN_THROWS ();
1971
1999
}
1972
2000
1973
- convert_to_long (sec );
1974
- convert_to_long (usec );
2001
+ zend_long valsec = zval_get_long (sec );
2002
+ zend_long valusec = zval_get_long (usec );
1975
2003
#ifndef PHP_WIN32
1976
- tv .tv_sec = Z_LVAL_P ( sec ) ;
1977
- tv .tv_usec = Z_LVAL_P ( usec ) ;
2004
+ tv .tv_sec = valsec ;
2005
+ tv .tv_usec = valusec ;
1978
2006
optlen = sizeof (tv );
1979
2007
opt_ptr = & tv ;
1980
2008
#else
1981
- timeout = Z_LVAL_P (sec ) * 1000 + Z_LVAL_P (usec ) / 1000 ;
2009
+ timeout = valsec * 1000 + valusec / 1000 ;
2010
+
1982
2011
optlen = sizeof (int );
1983
2012
opt_ptr = & timeout ;
1984
2013
#endif
@@ -2030,15 +2059,15 @@ PHP_FUNCTION(socket_set_option)
2030
2059
2031
2060
#ifdef SO_ATTACH_REUSEPORT_CBPF
2032
2061
case SO_ATTACH_REUSEPORT_CBPF : {
2033
- convert_to_long (arg4 );
2062
+ zend_long cbpf_val = zval_get_long (arg4 );
2034
2063
2035
- if (!Z_LVAL_P ( arg4 ) ) {
2064
+ if (!cbpf_val ) {
2036
2065
ov = 1 ;
2037
2066
optlen = sizeof (ov );
2038
2067
opt_ptr = & ov ;
2039
2068
optname = SO_DETACH_BPF ;
2040
2069
} else {
2041
- uint32_t k = (uint32_t )Z_LVAL_P ( arg4 ) ;
2070
+ uint32_t k = (uint32_t )cbpf_val ;
2042
2071
static struct sock_filter cbpf [8 ] = {0 };
2043
2072
static struct sock_fprog bpfprog ;
2044
2073
@@ -2065,8 +2094,7 @@ PHP_FUNCTION(socket_set_option)
2065
2094
2066
2095
default :
2067
2096
default_case :
2068
- convert_to_long (arg4 );
2069
- ov = Z_LVAL_P (arg4 );
2097
+ ov = zval_get_long (arg4 );
2070
2098
2071
2099
optlen = sizeof (ov );
2072
2100
opt_ptr = & ov ;
0 commit comments