@@ -1811,6 +1811,7 @@ PHP_FUNCTION(socket_set_option)
1811
1811
HashTable * opt_ht ;
1812
1812
zval * l_onoff , * l_linger ;
1813
1813
zval * sec , * usec ;
1814
+ bool failed ;
1814
1815
1815
1816
if (zend_parse_parameters (ZEND_NUM_ARGS (), "Ollz" , & arg1 , socket_ce , & level , & optname , & arg4 ) == FAILURE ) {
1816
1817
RETURN_THROWS ();
@@ -1883,11 +1884,19 @@ PHP_FUNCTION(socket_set_option)
1883
1884
RETURN_THROWS ();
1884
1885
}
1885
1886
1886
- convert_to_long (l_onoff );
1887
- convert_to_long (l_linger );
1887
+ zend_long zl_onoff = zval_try_get_long (l_onoff , & failed );
1888
+ if (failed ) {
1889
+ zend_argument_type_error (4 , "\"%s\" must be an int, %s given" , l_onoff_key , zend_zval_value_name (l_onoff ));
1890
+ RETURN_THROWS ();
1891
+ }
1892
+ zend_long zl_linger = zval_try_get_long (l_linger , & failed );
1893
+ if (failed ) {
1894
+ zend_argument_type_error (4 , "\"%s\" must be an int, %s given" , l_linger_key , zend_zval_value_name (l_linger ));
1895
+ RETURN_THROWS ();
1896
+ }
1888
1897
1889
- lv .l_onoff = (unsigned short )Z_LVAL_P ( l_onoff ) ;
1890
- lv .l_linger = (unsigned short )Z_LVAL_P ( l_linger ) ;
1898
+ lv .l_onoff = (unsigned short )zl_onoff ;
1899
+ lv .l_linger = (unsigned short )zl_linger ;
1891
1900
1892
1901
optlen = sizeof (lv );
1893
1902
opt_ptr = & lv ;
@@ -1898,6 +1907,7 @@ PHP_FUNCTION(socket_set_option)
1898
1907
case SO_SNDTIMEO : {
1899
1908
const char sec_key [] = "sec" ;
1900
1909
const char usec_key [] = "usec" ;
1910
+ bool failed ;
1901
1911
1902
1912
convert_to_array (arg4 );
1903
1913
opt_ht = Z_ARRVAL_P (arg4 );
@@ -1911,15 +1921,23 @@ PHP_FUNCTION(socket_set_option)
1911
1921
RETURN_THROWS ();
1912
1922
}
1913
1923
1914
- convert_to_long (sec );
1915
- convert_to_long (usec );
1924
+ zend_long zsec = zval_try_get_long (sec , & failed );
1925
+ if (failed ) {
1926
+ zend_argument_type_error (4 , "\"%s\" must be an int, %s given" , sec_key , zend_zval_value_name (sec ));
1927
+ RETURN_THROWS ();
1928
+ }
1929
+ zend_long zusec = zval_try_get_long (usec , & failed );
1930
+ if (failed ) {
1931
+ zend_argument_type_error (4 , "\"%s\" must be an int, %s given" , usec_key , zend_zval_value_name (usec ));
1932
+ RETURN_THROWS ();
1933
+ }
1916
1934
#ifndef PHP_WIN32
1917
- tv .tv_sec = Z_LVAL_P ( sec ) ;
1918
- tv .tv_usec = Z_LVAL_P ( usec ) ;
1935
+ tv .tv_sec = zsec ;
1936
+ tv .tv_usec = zusec ;
1919
1937
optlen = sizeof (tv );
1920
1938
opt_ptr = & tv ;
1921
1939
#else
1922
- timeout = Z_LVAL_P ( sec ) * 1000 + Z_LVAL_P ( usec ) / 1000 ;
1940
+ timeout = zsec * 1000 + zusec / 1000 ;
1923
1941
optlen = sizeof (int );
1924
1942
opt_ptr = & timeout ;
1925
1943
#endif
@@ -1971,15 +1989,19 @@ PHP_FUNCTION(socket_set_option)
1971
1989
1972
1990
#ifdef SO_ATTACH_REUSEPORT_CBPF
1973
1991
case SO_ATTACH_REUSEPORT_CBPF : {
1974
- convert_to_long (arg4 );
1992
+ zend_long fval = zval_try_get_long (arg4 , & failed );
1993
+ if (failed ) {
1994
+ zend_argument_type_error (4 , "must be an int, %s given" , zend_zval_value_name (arg4 ));
1995
+ RETURN_THROWS ();
1996
+ }
1975
1997
1976
- if (!Z_LVAL_P ( arg4 ) ) {
1998
+ if (!fval ) {
1977
1999
ov = 1 ;
1978
2000
optlen = sizeof (ov );
1979
2001
opt_ptr = & ov ;
1980
2002
optname = SO_DETACH_BPF ;
1981
2003
} else {
1982
- uint32_t k = (uint32_t )Z_LVAL_P ( arg4 ) ;
2004
+ uint32_t k = (uint32_t )fval ;
1983
2005
static struct sock_filter cbpf [8 ] = {0 };
1984
2006
static struct sock_fprog bpfprog ;
1985
2007
@@ -2006,8 +2028,11 @@ PHP_FUNCTION(socket_set_option)
2006
2028
2007
2029
default :
2008
2030
default_case :
2009
- convert_to_long (arg4 );
2010
- ov = Z_LVAL_P (arg4 );
2031
+ ov = zval_try_get_long (arg4 , & failed );
2032
+ if (failed ) {
2033
+ zend_argument_type_error (4 , "must be an int, %s given" , zend_zval_value_name (arg4 ));
2034
+ RETURN_THROWS ();
2035
+ }
2011
2036
2012
2037
optlen = sizeof (ov );
2013
2038
opt_ptr = & ov ;
0 commit comments