@@ -1970,8 +1970,16 @@ PHP_FUNCTION(socket_set_option)
1970
1970
const char l_onoff_key [] = "l_onoff" ;
1971
1971
const char l_linger_key [] = "l_linger" ;
1972
1972
1973
- convert_to_array (arg4 );
1974
- opt_ht = Z_ARRVAL_P (arg4 );
1973
+ if (Z_TYPE_P (arg4 ) != IS_ARRAY ) {
1974
+ if (UNEXPECTED (Z_TYPE_P (arg4 ) != IS_OBJECT )) {
1975
+ zend_argument_type_error (4 , "must be of type array when argument #3 ($option) is SO_LINGER, %s given" , zend_zval_value_name (arg4 ));
1976
+ RETURN_THROWS ();
1977
+ } else {
1978
+ opt_ht = Z_OBJPROP_P (arg4 );
1979
+ }
1980
+ } else {
1981
+ opt_ht = Z_ARRVAL_P (arg4 );
1982
+ }
1975
1983
1976
1984
if ((l_onoff = zend_hash_str_find (opt_ht , l_onoff_key , sizeof (l_onoff_key ) - 1 )) == NULL ) {
1977
1985
zend_argument_value_error (4 , "must have key \"%s\"" , l_onoff_key );
@@ -1982,11 +1990,21 @@ PHP_FUNCTION(socket_set_option)
1982
1990
RETURN_THROWS ();
1983
1991
}
1984
1992
1985
- convert_to_long (l_onoff );
1986
- convert_to_long (l_linger );
1993
+ zend_long val_lonoff = zval_get_long (l_onoff );
1994
+ zend_long val_linger = zval_get_long (l_linger );
1995
+
1996
+ if (val_lonoff < 0 || val_lonoff > USHRT_MAX ) {
1997
+ zend_argument_value_error (4 , "\"%s\" must be between 0 and %u" , l_onoff_key , USHRT_MAX );
1998
+ RETURN_THROWS ();
1999
+ }
2000
+
2001
+ if (val_linger < 0 || val_linger > USHRT_MAX ) {
2002
+ zend_argument_value_error (4 , "\"%s\" must be between 0 and %d" , l_linger , USHRT_MAX );
2003
+ RETURN_THROWS ();
2004
+ }
1987
2005
1988
- lv .l_onoff = (unsigned short )Z_LVAL_P ( l_onoff ) ;
1989
- lv .l_linger = (unsigned short )Z_LVAL_P ( l_linger ) ;
2006
+ lv .l_onoff = (unsigned short )val_lonoff ;
2007
+ lv .l_linger = (unsigned short )val_linger ;
1990
2008
1991
2009
optlen = sizeof (lv );
1992
2010
opt_ptr = & lv ;
@@ -1998,8 +2016,18 @@ PHP_FUNCTION(socket_set_option)
1998
2016
const char sec_key [] = "sec" ;
1999
2017
const char usec_key [] = "usec" ;
2000
2018
2001
- convert_to_array (arg4 );
2002
- opt_ht = Z_ARRVAL_P (arg4 );
2019
+ if (Z_TYPE_P (arg4 ) != IS_ARRAY ) {
2020
+ if (UNEXPECTED (Z_TYPE_P (arg4 ) != IS_OBJECT )) {
2021
+ zend_argument_type_error (4 , "must be of type array when argument #3 ($option) is %s, %s given" ,
2022
+ optname == SO_RCVTIMEO ? "SO_RCVTIMEO" : "SO_SNDTIMEO" ,
2023
+ zend_zval_value_name (arg4 ));
2024
+ RETURN_THROWS ();
2025
+ } else {
2026
+ opt_ht = Z_OBJPROP_P (arg4 );
2027
+ }
2028
+ } else {
2029
+ opt_ht = Z_ARRVAL_P (arg4 );
2030
+ }
2003
2031
2004
2032
if ((sec = zend_hash_str_find (opt_ht , sec_key , sizeof (sec_key ) - 1 )) == NULL ) {
2005
2033
zend_argument_value_error (4 , "must have key \"%s\"" , sec_key );
@@ -2010,11 +2038,11 @@ PHP_FUNCTION(socket_set_option)
2010
2038
RETURN_THROWS ();
2011
2039
}
2012
2040
2013
- convert_to_long (sec );
2014
- convert_to_long (usec );
2041
+ zend_long valsec = zval_get_long (sec );
2042
+ zend_long valusec = zval_get_long (usec );
2015
2043
#ifndef PHP_WIN32
2016
- tv .tv_sec = Z_LVAL_P ( sec ) ;
2017
- tv .tv_usec = Z_LVAL_P ( usec ) ;
2044
+ tv .tv_sec = valsec ;
2045
+ tv .tv_usec = valusec ;
2018
2046
optlen = sizeof (tv );
2019
2047
opt_ptr = & tv ;
2020
2048
#else
@@ -2070,15 +2098,15 @@ PHP_FUNCTION(socket_set_option)
2070
2098
2071
2099
#ifdef SO_ATTACH_REUSEPORT_CBPF
2072
2100
case SO_ATTACH_REUSEPORT_CBPF : {
2073
- convert_to_long (arg4 );
2101
+ zend_long cbpf_val = zval_get_long (arg4 );
2074
2102
2075
- if (!Z_LVAL_P ( arg4 ) ) {
2103
+ if (!cbpf_val ) {
2076
2104
ov = 1 ;
2077
2105
optlen = sizeof (ov );
2078
2106
opt_ptr = & ov ;
2079
2107
optname = SO_DETACH_BPF ;
2080
2108
} else {
2081
- uint32_t k = (uint32_t )Z_LVAL_P ( arg4 ) ;
2109
+ uint32_t k = (uint32_t )cbpf_val ;
2082
2110
static struct sock_filter cbpf [8 ] = {0 };
2083
2111
static struct sock_fprog bpfprog ;
2084
2112
@@ -2105,8 +2133,7 @@ PHP_FUNCTION(socket_set_option)
2105
2133
2106
2134
default :
2107
2135
default_case :
2108
- convert_to_long (arg4 );
2109
- ov = Z_LVAL_P (arg4 );
2136
+ ov = zval_get_long (arg4 );
2110
2137
2111
2138
optlen = sizeof (ov );
2112
2139
opt_ptr = & ov ;
0 commit comments