From: Gustavo André dos Santos Lopes Date: Thu, 17 Mar 2011 15:36:52 +0000 (+0000) Subject: - Merged fix for bug #51958 socket_accept() fails on IPv6 server sockets. X-Git-Tag: php-5.3.7RC1~234 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=be87834321151d908d9dc879e8d3e462fc67b733;p=php - Merged fix for bug #51958 socket_accept() fails on IPv6 server sockets. See r309238 for commit in trunk. --- diff --git a/NEWS b/NEWS index ec4ca998ba..7d3789e5a9 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,9 @@ PHP NEWS . Fixed bug #54167 (PDO_DBLIB returns null on SQLUNIQUE field). (mjh at hodginsmedia dot com, Felipe) +- Sockets extension + . Fixed bug #51958 (socket_accept() fails on IPv6 server sockets). (Gustavo) + 17 Mar 2011, PHP 5.3.6 - Upgraded bundled Sqlite3 to version 3.7.4. (Ilia) - Upgraded bundled PCRE to version 8.11. (Ilia) diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 7d836862d6..7b3c54ff88 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -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); } /* }}} */ diff --git a/ext/sockets/tests/bug51958.phpt b/ext/sockets/tests/bug51958.phpt new file mode 100644 index 0000000000..e5db68340c --- /dev/null +++ b/ext/sockets/tests/bug51958.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #51958: socket_accept() fails on IPv6 server sockets +--SKIPIF-- +