From 95a9e558b613be6918629387ff1975d979de2a16 Mon Sep 17 00:00:00 2001 From: David Carlier Date: Sun, 16 May 2021 12:10:36 +0100 Subject: [PATCH] Pull #6989 FreeBSD defines SO_ACCEPTFILTER --- .cirrus.yml | 1 + UPGRADING | 3 ++ ext/sockets/sockets.c | 32 ++++++++++++++++ ext/sockets/tests/socket_set_option_acf.phpt | 40 ++++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 ext/sockets/tests/socket_set_option_acf.phpt diff --git a/.cirrus.yml b/.cirrus.yml index 79ee37e1781..7547bd18cb7 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -10,6 +10,7 @@ task: install_script: #- sed -i -e 's/quarterly/latest/g' /etc/pkg/FreeBSD.conf #- pkg upgrade -y + - kldload accf_http - pkg install -y autoconf bison gmake re2c icu libiconv png freetype2 enchant2 bzip2 krb5 t1lib gmp tidyp libsodium libzip libxml2 libxslt openssl oniguruma pkgconf webp script: - ./buildconf -f diff --git a/UPGRADING b/UPGRADING index 93437c9aa37..c80ca7714e2 100644 --- a/UPGRADING +++ b/UPGRADING @@ -404,6 +404,9 @@ PHP 8.1 UPGRADE NOTES - OpenSSL: . The OpenSSL extension now requires at least OpenSSL version 1.0.2. +- Sockets: + . FreeBSD defines SO_ACCEPTFILTER + - Standard: . --with-password-argon2 now uses pkg-config to detect libargon2. As such, an alternative libargon2 location should now be specified using diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 1f0247b0ec8..cac6b3bbd18 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -535,6 +535,7 @@ static PHP_MINIT_FUNCTION(sockets) REGISTER_LONG_CONSTANT("SO_LISTENQLIMIT", SO_LISTENQLIMIT, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SO_LISTENQLEN", SO_LISTENQLEN, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SO_USER_COOKIE", SO_USER_COOKIE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SO_ACCEPTFILTER", SO_ACCEPTFILTER, CONST_CS | CONST_PERSISTENT); #endif REGISTER_LONG_CONSTANT("SOL_SOCKET", SOL_SOCKET, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SOMAXCONN", SOMAXCONN, CONST_CS | CONST_PERSISTENT); @@ -1818,6 +1819,23 @@ PHP_FUNCTION(socket_get_option) add_assoc_long(return_value, "sec", tv.tv_sec); add_assoc_long(return_value, "usec", tv.tv_usec); return; +#ifdef SO_ACCEPTFILTER + case SO_ACCEPTFILTER: { + + struct accept_filter_arg af = {0}; + optlen = sizeof(af); + + if (getsockopt(php_sock->bsd_socket, level, optname, (char*)&af, &optlen) != 0) { + PHP_SOCKET_ERROR(php_sock, "Unable to retrieve socket option", errno); + RETURN_FALSE; + } + + array_init(return_value); + + add_assoc_string(return_value, "af_name", af.af_name); + return; + } +#endif } } @@ -1958,6 +1976,20 @@ PHP_FUNCTION(socket_set_option) } #endif +#ifdef SO_ACCEPTFILTER + case SO_ACCEPTFILTER: { + if (Z_TYPE_P(arg4) != IS_STRING) { + php_error_docref(NULL, E_WARNING, "Invalid filter argument type"); + RETURN_FALSE; + } + struct accept_filter_arg af = {0}; + strlcpy(af.af_name, Z_STRVAL_P(arg4), sizeof(af.af_name)); + opt_ptr = ⁡ + optlen = sizeof(af); + break; + } +#endif + default: default_case: convert_to_long(arg4); diff --git a/ext/sockets/tests/socket_set_option_acf.phpt b/ext/sockets/tests/socket_set_option_acf.phpt new file mode 100644 index 00000000000..92c0405f71a --- /dev/null +++ b/ext/sockets/tests/socket_set_option_acf.phpt @@ -0,0 +1,40 @@ +--TEST-- +Test if socket_set_option() works, option:SO_ACCEPTFILTER +--DESCRIPTION-- +-wrong params +-set/get params comparison +-l_linger not given +--SKIPIF-- + +--FILE-- +getMessage() . \PHP_EOL; +} +socket_listen($socket); +var_dump(socket_set_option( $socket, SOL_SOCKET, SO_ACCEPTFILTER, "httpready")); +var_dump(socket_get_option( $socket, SOL_SOCKET, SO_ACCEPTFILTER)); +socket_close($socket); +?> +--EXPECTF-- +Warning: socket_set_option(): Invalid filter argument type in %s on line %d +bool(false) +bool(true) +array(1) { + ["af_name"]=> + string(9) "httpready" +}