1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 08:12:21 +01:00

Pull #6989 FreeBSD defines SO_ACCEPTFILTER

This commit is contained in:
David Carlier
2021-05-16 12:10:36 +01:00
committed by Joe Watkins
parent 13d396bb59
commit 95a9e558b6
4 changed files with 76 additions and 0 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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--
<?php
if (!extension_loaded('sockets')) {
die('SKIP sockets extension not available.');
}
if (strpos(PHP_OS, 'FreeBSD') === false) {
die('SKIP on non FreeBSD platforms');
}
?>
--FILE--
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die('Unable to create AF_INET socket [socket]');
}
try {
var_dump(socket_set_option( $socket, SOL_SOCKET, SO_ACCEPTFILTER, 1));
} catch (\ValueError $e) {
echo $e->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"
}