svn: /php/php-src/trunk/ext/sockets/ sockets.c tests/bug51958.phpt
| From: | Gustavo André dos Santos Lopes | Date: | Mon, 14 Mar 2011 22:59:05 +0000 |
| Subject: | svn: /php/php-src/trunk/ext/sockets/ sockets.c tests/bug51958.phpt | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-64680@lists.php.net to get a copy of this message | ||
cataphract Mon, 14 Mar 2011 22:59:05 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=309238
Log:
- Fixed bug #51958: socket_accept() fails on IPv6 sockets.
#On hold for 5.3
Bug: http://bugs.php.net/51958 (Assigned) socket_accept()
fails on IPv6 server sockets
Changed paths:
U php/php-src/trunk/ext/sockets/sockets.c
A php/php-src/trunk/ext/sockets/tests/bug51958.phpt
Modified: php/php-src/trunk/ext/sockets/sockets.c
===================================================================
--- php/php-src/trunk/ext/sockets/sockets.c 2011-03-14 22:27:40 UTC (rev 309237)
+++ php/php-src/trunk/ext/sockets/sockets.c 2011-03-14 22:59:05 UTC (rev 309238)
@@ -402,16 +402,13 @@
}
/* }}} */
-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);
@@ -419,6 +416,10 @@
return 0;
}
+ out_sock->error = 0;
+ out_sock->blocking = 1;
+ out_sock->type = la->sa_family;
+
return 1;
}
/* }}} */
@@ -1023,9 +1024,10 @@
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;
@@ -1033,13 +1035,10 @@
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);
}
/* }}} */
Added: php/php-src/trunk/ext/sockets/tests/bug51958.phpt
===================================================================
--- php/php-src/trunk/ext/sockets/tests/bug51958.phpt (rev 0)
+++ php/php-src/trunk/ext/sockets/tests/bug51958.phpt 2011-03-14 22:59:05 UTC (rev 309238)
@@ -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