diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 9e33f4e6cfd..addcebbeda2 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1248,6 +1248,11 @@ PHP_FUNCTION(socket_strerror) Z_PARAM_LONG(arg1) ZEND_PARSE_PARAMETERS_END(); + if (ZEND_LONG_EXCEEDS_INT(arg1)) { + zend_argument_value_error(1, "must be between %d and %d", INT_MIN, INT_MAX); + RETURN_THROWS(); + } + RETURN_STRING(sockets_strerror(arg1)); } /* }}} */ diff --git a/ext/sockets/tests/gh16267.phpt b/ext/sockets/tests/gh16267.phpt new file mode 100644 index 00000000000..d2462b31645 --- /dev/null +++ b/ext/sockets/tests/gh16267.phpt @@ -0,0 +1,22 @@ +--TEST-- +GH-16267 - overflow on socket_strerror argument +--EXTENSIONS-- +sockets +--SKIPIF-- + +--FILE-- +getMessage() . PHP_EOL; +} +try { + socket_strerror(PHP_INT_MAX); +} catch (\ValueError $e) { + echo $e->getMessage() . PHP_EOL; +} +?> +--EXPECTF-- +socket_strerror(): Argument #1 ($error_code) must be between %s and %s +socket_strerror(): Argument #1 ($error_code) must be between %s and %s