diff options
author | Jani Taskinen <jani@php.net> | 2008-07-16 14:08:38 +0000 |
---|---|---|
committer | Jani Taskinen <jani@php.net> | 2008-07-16 14:08:38 +0000 |
commit | d91bc9eca28aa11d6e238f646f9a1eb936e77b1f (patch) | |
tree | 2dc55fa33222a530bf235b5f362c4a589c9ee36a | |
parent | 644b06978a315d152179c3368a4a1bb725c6e3de (diff) | |
download | php-git-d91bc9eca28aa11d6e238f646f9a1eb936e77b1f.tar.gz |
MFH:- Fixed bug #44127 (UNIX abstract namespace socket connect does not work)
-rw-r--r-- | ext/sockets/sockets.c | 4 | ||||
-rw-r--r-- | ext/sockets/tests/ipv4loop.phpt | 2 | ||||
-rw-r--r-- | ext/sockets/tests/ipv6loop.phpt | 2 | ||||
-rw-r--r-- | ext/sockets/tests/unixloop.phpt | 55 | ||||
-rw-r--r-- | main/streams/xp_socket.c | 2 |
5 files changed, 60 insertions, 5 deletions
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index ab0d7b81d7..93283ec4f0 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1328,8 +1328,8 @@ PHP_FUNCTION(socket_connect) memset(&s_un, 0, sizeof(struct sockaddr_un)); s_un.sun_family = AF_UNIX; - snprintf(s_un.sun_path, 108, "%s", addr); - retval = connect(php_sock->bsd_socket, (struct sockaddr *) &s_un, SUN_LEN(&s_un)); + memcpy(&s_un.sun_path, addr, addr_len); + retval = connect(php_sock->bsd_socket, (struct sockaddr *) &s_un, (socklen_t) XtOffsetOf(struct sockaddr_un, sun_path) + addr_len); break; default: diff --git a/ext/sockets/tests/ipv4loop.phpt b/ext/sockets/tests/ipv4loop.phpt index 7c6c0db31e..9fdcc17dad 100644 --- a/ext/sockets/tests/ipv4loop.phpt +++ b/ext/sockets/tests/ipv4loop.phpt @@ -3,7 +3,7 @@ IPv4 Loopback test --SKIPIF-- <?php if (!extension_loaded('sockets')) { - die('skip sockets extenion not available.'); + die('skip sockets extension not available.'); } ?> --FILE-- diff --git a/ext/sockets/tests/ipv6loop.phpt b/ext/sockets/tests/ipv6loop.phpt index 45d2a05fc0..6fb584045f 100644 --- a/ext/sockets/tests/ipv6loop.phpt +++ b/ext/sockets/tests/ipv6loop.phpt @@ -3,7 +3,7 @@ IPv6 Loopback test --SKIPIF-- <?php if (!extension_loaded('sockets')) { - die('skip sockets extenion not available.'); + die('skip sockets extension not available.'); } if (!defined("AF_INET6")) { die('skip no IPv6 support'); diff --git a/ext/sockets/tests/unixloop.phpt b/ext/sockets/tests/unixloop.phpt new file mode 100644 index 0000000000..1b547c3b3c --- /dev/null +++ b/ext/sockets/tests/unixloop.phpt @@ -0,0 +1,55 @@ +--TEST-- +Unix domain socket Loopback test +--SKIPIF-- +<?php + if (!extension_loaded('sockets')) { + die('skip sockets extension not available.'); + } +?> +--FILE-- +<?php + $sock_path = sprintf("/tmp/%s.sock", uniqid()); + + if (file_exists($sock_path)) + die('Temporary socket already exists.'); + + /* Setup socket server */ + $server = socket_create(AF_UNIX, SOCK_STREAM, 0); + if (!$server) { + die('Unable to create AF_UNIX socket [server]'); + } + if (!socket_bind($server, $sock_path)) { + die("Unable to bind to $sock_path"); + } + if (!socket_listen($server, 2)) { + die('Unable to listen on socket'); + } + + /* Connect to it */ + $client = socket_create(AF_UNIX, SOCK_STREAM, 0); + if (!$client) { + die('Unable to create AF_UNIX socket [client]'); + } + if (!socket_connect($client, $sock_path)) { + die('Unable to connect to server socket'); + } + + /* Accept that connection */ + $socket = socket_accept($server); + if (!$socket) { + die('Unable to accept connection'); + } + + socket_write($client, "ABCdef123\n"); + + $data = socket_read($socket, 10, PHP_BINARY_READ); + var_dump($data); + + socket_close($client); + socket_close($socket); + socket_close($server); + @unlink($sock_path); +?> +--EXPECT-- +string(10) "ABCdef123 +" diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c index 2e4763e5b8..a7736878f4 100644 --- a/main/streams/xp_socket.c +++ b/main/streams/xp_socket.c @@ -621,7 +621,7 @@ static inline int php_tcp_sockop_connect(php_stream *stream, php_netstream_data_ parse_unix_address(xparam, &unix_addr TSRMLS_CC); ret = php_network_connect_socket(sock->socket, - (const struct sockaddr *)&unix_addr, (socklen_t)sizeof(unix_addr), + (const struct sockaddr *)&unix_addr, (socklen_t) XtOffsetOf(struct sockaddr_un, sun_path) + xparam->inputs.namelen, xparam->op == STREAM_XPORT_OP_CONNECT_ASYNC, xparam->inputs.timeout, xparam->want_errortext ? &xparam->outputs.error_text : NULL, &err); |