@@ -1871,8 +1871,16 @@ PHP_FUNCTION(socket_set_option)
1871
1871
const char l_onoff_key [] = "l_onoff" ;
1872
1872
const char l_linger_key [] = "l_linger" ;
1873
1873
1874
- convert_to_array (arg4 );
1875
- opt_ht = Z_ARRVAL_P (arg4 );
1874
+ if (Z_TYPE_P (arg4 ) != IS_ARRAY ) {
1875
+ if (UNEXPECTED (Z_TYPE_P (arg4 ) != IS_OBJECT )) {
1876
+ zend_argument_type_error (4 , "must be of type array when argument #3 ($option) is SO_LINGER, %s given" , zend_zval_value_name (arg4 ));
1877
+ RETURN_THROWS ();
1878
+ } else {
1879
+ opt_ht = Z_OBJPROP_P (arg4 );
1880
+ }
1881
+ } else {
1882
+ opt_ht = Z_ARRVAL_P (arg4 );
1883
+ }
1876
1884
1877
1885
if ((l_onoff = zend_hash_str_find (opt_ht , l_onoff_key , sizeof (l_onoff_key ) - 1 )) == NULL ) {
1878
1886
zend_argument_value_error (4 , "must have key \"%s\"" , l_onoff_key );
@@ -1883,11 +1891,21 @@ PHP_FUNCTION(socket_set_option)
1883
1891
RETURN_THROWS ();
1884
1892
}
1885
1893
1886
- convert_to_long (l_onoff );
1887
- convert_to_long (l_linger );
1894
+ zend_long val_lonoff = zval_get_long (l_onoff );
1895
+ zend_long val_linger = zval_get_long (l_linger );
1896
+
1897
+ if (val_lonoff < 0 || val_lonoff > USHRT_MAX ) {
1898
+ zend_argument_value_error (4 , "\"%s\" must be between 0 and %u" , l_onoff_key , USHRT_MAX );
1899
+ RETURN_THROWS ();
1900
+ }
1901
+
1902
+ if (val_linger < 0 || val_linger > USHRT_MAX ) {
1903
+ zend_argument_value_error (4 , "\"%s\" must be between 0 and %d" , l_linger , USHRT_MAX );
1904
+ RETURN_THROWS ();
1905
+ }
1888
1906
1889
- lv .l_onoff = (unsigned short )Z_LVAL_P ( l_onoff ) ;
1890
- lv .l_linger = (unsigned short )Z_LVAL_P ( l_linger ) ;
1907
+ lv .l_onoff = (unsigned short )val_lonoff ;
1908
+ lv .l_linger = (unsigned short )val_linger ;
1891
1909
1892
1910
optlen = sizeof (lv );
1893
1911
opt_ptr = & lv ;
@@ -1899,8 +1917,18 @@ PHP_FUNCTION(socket_set_option)
1899
1917
const char sec_key [] = "sec" ;
1900
1918
const char usec_key [] = "usec" ;
1901
1919
1902
- convert_to_array (arg4 );
1903
- opt_ht = Z_ARRVAL_P (arg4 );
1920
+ if (Z_TYPE_P (arg4 ) != IS_ARRAY ) {
1921
+ if (UNEXPECTED (Z_TYPE_P (arg4 ) != IS_OBJECT )) {
1922
+ zend_argument_type_error (4 , "must be of type array when argument #3 ($option) is %s, %s given" ,
1923
+ optname == SO_RCVTIMEO ? "SO_RCVTIMEO" : "SO_SNDTIMEO" ,
1924
+ zend_zval_value_name (arg4 ));
1925
+ RETURN_THROWS ();
1926
+ } else {
1927
+ opt_ht = Z_OBJPROP_P (arg4 );
1928
+ }
1929
+ } else {
1930
+ opt_ht = Z_ARRVAL_P (arg4 );
1931
+ }
1904
1932
1905
1933
if ((sec = zend_hash_str_find (opt_ht , sec_key , sizeof (sec_key ) - 1 )) == NULL ) {
1906
1934
zend_argument_value_error (4 , "must have key \"%s\"" , sec_key );
@@ -1911,15 +1939,16 @@ PHP_FUNCTION(socket_set_option)
1911
1939
RETURN_THROWS ();
1912
1940
}
1913
1941
1914
- convert_to_long (sec );
1915
- convert_to_long (usec );
1942
+ zend_long valsec = zval_get_long (sec );
1943
+ zend_long valusec = zval_get_long (usec );
1916
1944
#ifndef PHP_WIN32
1917
- tv .tv_sec = Z_LVAL_P ( sec ) ;
1918
- tv .tv_usec = Z_LVAL_P ( usec ) ;
1945
+ tv .tv_sec = valsec ;
1946
+ tv .tv_usec = valusec ;
1919
1947
optlen = sizeof (tv );
1920
1948
opt_ptr = & tv ;
1921
1949
#else
1922
- timeout = Z_LVAL_P (sec ) * 1000 + Z_LVAL_P (usec ) / 1000 ;
1950
+ timeout = valsec * 1000 + valusec / 1000 ;
1951
+
1923
1952
optlen = sizeof (int );
1924
1953
opt_ptr = & timeout ;
1925
1954
#endif
@@ -1971,15 +2000,15 @@ PHP_FUNCTION(socket_set_option)
1971
2000
1972
2001
#ifdef SO_ATTACH_REUSEPORT_CBPF
1973
2002
case SO_ATTACH_REUSEPORT_CBPF : {
1974
- convert_to_long (arg4 );
2003
+ zend_long cbpf_val = zval_get_long (arg4 );
1975
2004
1976
- if (!Z_LVAL_P ( arg4 ) ) {
2005
+ if (!cbpf_val ) {
1977
2006
ov = 1 ;
1978
2007
optlen = sizeof (ov );
1979
2008
opt_ptr = & ov ;
1980
2009
optname = SO_DETACH_BPF ;
1981
2010
} else {
1982
- uint32_t k = (uint32_t )Z_LVAL_P ( arg4 ) ;
2011
+ uint32_t k = (uint32_t )cbpf_val ;
1983
2012
static struct sock_filter cbpf [8 ] = {0 };
1984
2013
static struct sock_fprog bpfprog ;
1985
2014
@@ -2006,8 +2035,7 @@ PHP_FUNCTION(socket_set_option)
2006
2035
2007
2036
default :
2008
2037
default_case :
2009
- convert_to_long (arg4 );
2010
- ov = Z_LVAL_P (arg4 );
2038
+ ov = zval_get_long (arg4 );
2011
2039
2012
2040
optlen = sizeof (ov );
2013
2041
opt_ptr = & ov ;
0 commit comments