]> granicus.if.org Git - php/commitdiff
MFH:- Fixed bug #44127 (UNIX abstract namespace socket connect does not work)
authorJani Taskinen <jani@php.net>
Wed, 16 Jul 2008 14:08:38 +0000 (14:08 +0000)
committerJani Taskinen <jani@php.net>
Wed, 16 Jul 2008 14:08:38 +0000 (14:08 +0000)
ext/sockets/sockets.c
ext/sockets/tests/ipv4loop.phpt
ext/sockets/tests/ipv6loop.phpt
ext/sockets/tests/unixloop.phpt [new file with mode: 0644]
main/streams/xp_socket.c

index ab0d7b81d7935f68d82d7eb8f26f937d08118478..93283ec4f0767013f4f05830e9a4fcdf6c8026d5 100644 (file)
@@ -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:
index 7c6c0db31ee437491b240ca246dad6e97dc285c7..9fdcc17dad06f4ad6ce95aee82e274a56d0862f0 100644 (file)
@@ -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--
index 45d2a05fc06a80661414a73e7a226041af4e9064..6fb584045f7cc4b653edfdcd260edb58f199d0bf 100644 (file)
@@ -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 (file)
index 0000000..1b547c3
--- /dev/null
@@ -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
+"
index 2e4763e5b8a860eb800ef7dc9871c70b6607cdae..a7736878f4fcf838d815a58bfed57034297483e4 100644 (file)
@@ -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);