diff --git a/ext/sockets/conversions.c b/ext/sockets/conversions.c index a419a20c873c..eb4e58b3988e 100644 --- a/ext/sockets/conversions.c +++ b/ext/sockets/conversions.c @@ -1385,7 +1385,7 @@ static void from_zval_write_fd_array_aux(zval *elem, unsigned i, void **args, se return; } - iarr[i] = sock->bsd_socket; + iarr[i - 1] = sock->bsd_socket; return; } diff --git a/ext/sockets/tests/socket_cmsg_rights.phpt b/ext/sockets/tests/socket_cmsg_rights.phpt index 1794eaf767ac..8bfbcd57157f 100644 --- a/ext/sockets/tests/socket_cmsg_rights.phpt +++ b/ext/sockets/tests/socket_cmsg_rights.phpt @@ -58,7 +58,7 @@ if ($data["control"]) { if ($control["level"] == SOL_SOCKET && $control["type"] == SCM_RIGHTS) { foreach ($control["data"] as $resource) { - if (!is_resource($resource)) { + if (!is_resource($resource) && !($resource instanceof Socket)) { echo "FAIL RES\n"; var_dump($data); exit; diff --git a/ext/sockets/tests/socket_sendmsg_scm_rights_object.phpt b/ext/sockets/tests/socket_sendmsg_scm_rights_object.phpt new file mode 100644 index 000000000000..907ea70ac169 --- /dev/null +++ b/ext/sockets/tests/socket_sendmsg_scm_rights_object.phpt @@ -0,0 +1,77 @@ +--TEST-- +socket_sendmsg(): SCM_RIGHTS transfers Socket objects with the correct fds +--EXTENSIONS-- +sockets +--SKIPIF-- + +--FILE-- + ['x'], + 'control' => [[ + 'level' => SOL_SOCKET, + 'type' => SCM_RIGHTS, + 'data' => [$payload1, $payload2], + ]], +], 0); + +$data = [ + 'name' => [], + 'buffer_size' => 64, + 'controllen' => socket_cmsg_space(SOL_SOCKET, SCM_RIGHTS, 2), +]; +socket_recvmsg($recv, $data, 0); + +$got = $data['control'][0]['data']; +var_dump(count($got)); +var_dump($got[0] instanceof Socket); +var_dump($got[1] instanceof Socket); +socket_getsockname($got[0], $addr0); +socket_getsockname($got[1], $addr1); +var_dump($addr0 === $ppath1); +var_dump($addr1 === $ppath2); +?> +--CLEAN-- + +--EXPECT-- +int(2) +bool(true) +bool(true) +bool(true) +bool(true)