diff options
| author | Ondřej Surý <ondrej@sury.org> | 2011-08-19 10:22:38 +0200 |
|---|---|---|
| committer | Ondřej Surý <ondrej@sury.org> | 2011-08-19 10:22:38 +0200 |
| commit | f452a2b3e4e4279b27594a8ddb66525442d59227 (patch) | |
| tree | d05cb62c5515ada33076d3cc3e49b664733a478c /ext/sockets | |
| parent | 038ba12e8724d537040e88ec794354b0c063f0a6 (diff) | |
| download | php-upstream/5.3.7.tar.gz | |
Imported Upstream version 5.3.7upstream/5.3.7
Diffstat (limited to 'ext/sockets')
| -rw-r--r-- | ext/sockets/sockets.c | 40 | ||||
| -rw-r--r-- | ext/sockets/tests/bug51958.phpt | 22 | ||||
| -rw-r--r-- | ext/sockets/tests/socket_strerror.phpt | 2 |
3 files changed, 47 insertions, 17 deletions
diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 9e06b2871..dab8e3840 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: sockets.c 306939 2011-01-01 02:19:59Z felipe $ */ +/* $Id: sockets.c 313665 2011-07-25 11:42:53Z felipe $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -300,7 +300,7 @@ const zend_function_entry sockets_functions[] = { PHP_FALIAS(socket_getopt, socket_get_option, arginfo_socket_get_option) PHP_FALIAS(socket_setopt, socket_set_option, arginfo_socket_set_option) - {NULL, NULL, NULL} + PHP_FE_END }; /* }}} */ @@ -394,16 +394,13 @@ static int php_open_listen_sock(php_socket **php_sock, int port, int backlog TSR } /* }}} */ -static int php_accept_connect(php_socket *in_sock, php_socket **new_sock, struct sockaddr *la TSRMLS_DC) /* {{{ */ +static int php_accept_connect(php_socket *in_sock, php_socket **new_sock, struct sockaddr *la, socklen_t *la_len TSRMLS_DC) /* {{{ */ { - socklen_t salen; php_socket *out_sock = (php_socket*)emalloc(sizeof(php_socket)); *new_sock = out_sock; - salen = sizeof(*la); - out_sock->blocking = 1; - out_sock->bsd_socket = accept(in_sock->bsd_socket, la, &salen); + out_sock->bsd_socket = accept(in_sock->bsd_socket, la, la_len); if (IS_INVALID_SOCKET(out_sock)) { PHP_SOCKET_ERROR(out_sock, "unable to accept incoming connection", errno); @@ -411,6 +408,10 @@ static int php_accept_connect(php_socket *in_sock, php_socket **new_sock, struct return 0; } + out_sock->error = 0; + out_sock->blocking = 1; + out_sock->type = la->sa_family; + return 1; } /* }}} */ @@ -880,9 +881,10 @@ PHP_FUNCTION(socket_create_listen) Accepts a connection on the listening socket fd */ PHP_FUNCTION(socket_accept) { - zval *arg1; - php_socket *php_sock, *new_sock; - struct sockaddr_in sa; + zval *arg1; + php_socket *php_sock, *new_sock; + php_sockaddr_storage sa; + socklen_t sa_len = sizeof(sa); if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) { return; @@ -890,13 +892,10 @@ PHP_FUNCTION(socket_accept) ZEND_FETCH_RESOURCE(php_sock, php_socket *, &arg1, -1, le_socket_name, le_socket); - if (!php_accept_connect(php_sock, &new_sock, (struct sockaddr *) &sa TSRMLS_CC)) { + if (!php_accept_connect(php_sock, &new_sock, (struct sockaddr*)&sa, &sa_len TSRMLS_CC)) { RETURN_FALSE; } - new_sock->error = 0; - new_sock->blocking = 1; - ZEND_REGISTER_RESOURCE(return_value, new_sock, le_socket); } /* }}} */ @@ -917,8 +916,10 @@ PHP_FUNCTION(socket_set_nonblock) if (php_set_sock_blocking(php_sock->bsd_socket, 0 TSRMLS_CC) == SUCCESS) { php_sock->blocking = 0; RETURN_TRUE; + } else { + PHP_SOCKET_ERROR(php_sock, "unable to set nonblocking mode", errno); + RETURN_FALSE; } - RETURN_FALSE; } /* }}} */ @@ -938,8 +939,10 @@ PHP_FUNCTION(socket_set_block) if (php_set_sock_blocking(php_sock->bsd_socket, 1 TSRMLS_CC) == SUCCESS) { php_sock->blocking = 1; RETURN_TRUE; + } else { + PHP_SOCKET_ERROR(php_sock, "unable to set blocking mode", errno); + RETURN_FALSE; } - RETURN_FALSE; } /* }}} */ @@ -1333,6 +1336,11 @@ PHP_FUNCTION(socket_connect) break; case AF_UNIX: + if (addr_len >= sizeof(s_un.sun_path)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Path too long"); + RETURN_FALSE; + } + memset(&s_un, 0, sizeof(struct sockaddr_un)); s_un.sun_family = AF_UNIX; diff --git a/ext/sockets/tests/bug51958.phpt b/ext/sockets/tests/bug51958.phpt new file mode 100644 index 000000000..afccd6ce2 --- /dev/null +++ b/ext/sockets/tests/bug51958.phpt @@ -0,0 +1,22 @@ +--TEST--
+Bug #51958: socket_accept() fails on IPv6 server sockets
+--SKIPIF--
+<?php
+if (!extension_loaded('sockets')) {
+ die('skip sockets extension not available.');
+}
+if (!defined('IPPROTO_IPV6')) {
+ die('skip IPv6 not available.');
+}
+if (PHP_OS != "WINNT")
+ die('skip test relies Winsock\'s error code for WSAEWOULDBLOCK/EAGAIN');
+--FILE--
+<?php
+$listenfd = socket_create(AF_INET6, SOCK_STREAM, SOL_TCP);
+socket_bind($listenfd, "::1", 13579);
+socket_listen($listenfd);
+socket_set_nonblock($listenfd);
+$connfd = @socket_accept($listenfd);
+echo socket_last_error();
+--EXPECT--
+10035
diff --git a/ext/sockets/tests/socket_strerror.phpt b/ext/sockets/tests/socket_strerror.phpt index d1759c582..52e7a0a48 100644 --- a/ext/sockets/tests/socket_strerror.phpt +++ b/ext/sockets/tests/socket_strerror.phpt @@ -154,4 +154,4 @@ string(20) "Key has been revoked" string(27) "Key was rejected by service" string(10) "Owner died" string(21) "State not recoverable" -string(17) "Unknown error 132" +string(%d) "%s" |
