cataphract                               Thu, 17 Mar 2011 15:36:52 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=309350

Log:
- Merged fix for bug #51958 socket_accept() fails on IPv6 server sockets.
  See r309238 for commit in trunk.

Bug: http://bugs.php.net/51958 (error getting bug information)
      
Changed paths:
    U   php/php-src/branches/PHP_5_3/NEWS
    U   php/php-src/branches/PHP_5_3/ext/sockets/sockets.c
    A   php/php-src/branches/PHP_5_3/ext/sockets/tests/bug51958.phpt

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS   2011-03-17 15:27:15 UTC (rev 309349)
+++ php/php-src/branches/PHP_5_3/NEWS   2011-03-17 15:36:52 UTC (rev 309350)
@@ -17,6 +17,9 @@
   . 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)

Modified: php/php-src/branches/PHP_5_3/ext/sockets/sockets.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/sockets/sockets.c  2011-03-17 15:27:15 UTC 
(rev 309349)
+++ php/php-src/branches/PHP_5_3/ext/sockets/sockets.c  2011-03-17 15:36:52 UTC 
(rev 309350)
@@ -394,16 +394,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);
@@ -411,6 +408,10 @@
                return 0;
        }

+       out_sock->error = 0;
+       out_sock->blocking = 1;
+       out_sock->type = la->sa_family;
+
        return 1;
 }
 /* }}} */
@@ -880,9 +881,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;
@@ -890,13 +892,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/branches/PHP_5_3/ext/sockets/tests/bug51958.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/sockets/tests/bug51958.phpt                
                (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/sockets/tests/bug51958.phpt        
2011-03-17 15:36:52 UTC (rev 309350)
@@ -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

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to