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:
committed by
Joe Watkins
parent
13d396bb59
commit
95a9e558b6
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
40
ext/sockets/tests/socket_set_option_acf.phpt
Normal file
40
ext/sockets/tests/socket_set_option_acf.phpt
Normal 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"
|
||||
}
|
||||
Reference in New Issue
Block a user