ID:               49447
 Updated by:       j...@php.net
 Reported By:      sriram dot natarajan at gmail dot com
-Status:           Analyzed
+Status:           Assigned
 Bug Type:         Sockets related
-Operating System: windows xp
+Operating System: win32 only - windows xp
 PHP Version:      5.3.0
 Assigned To:      srinatar


Previous Comments:
------------------------------------------------------------------------

[2009-09-03 01:39:46] srina...@php.net

here is the patch to address this issue. 

Index: ext/openssl/xp_ssl.c
===================================================================
--- ext/openssl/xp_ssl.c        (revision 287975)
+++ ext/openssl/xp_ssl.c        (working copy)
@@ -259,6 +259,10 @@
                        SSL_CTX_free(sslsock->ctx);
                        sslsock->ctx = NULL;
                }
+#ifdef PHP_WIN32
+               if (sslsock->s.socket == -1)
+                       sslsock->s.socket = SOCK_ERR;
+#endif
                if (sslsock->s.socket != SOCK_ERR) {
 #ifdef PHP_WIN32
                        /* prevent more data from coming in */
Index: ext/ftp/ftp.c
===================================================================
--- ext/ftp/ftp.c       (revision 287975)
+++ ext/ftp/ftp.c       (working copy)
@@ -147,7 +147,7 @@
 
        size = sizeof(ftp->localaddr);
        memset(&ftp->localaddr, 0, size);
-       if (getsockname(ftp->fd, (struct sockaddr*) &ftp->localaddr, &size)
== -1) {
+       if (getsockname(ftp->fd, (struct sockaddr*) &ftp->localaddr, &size)
!= 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "getsockname 
failed: %s
(%d)", strerror(errno), errno);
                goto bail;
        }
@@ -1387,7 +1387,7 @@
 
        sa = (struct sockaddr *) &ftp->localaddr;
        /* bind/listen */
-       if ((fd = socket(sa->sa_family, SOCK_STREAM, 0)) == -1) {
+       if ((fd = socket(sa->sa_family, SOCK_STREAM, 0)) == SOCK_ERR) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "socket() failed: %s
(%d)", strerror(errno), errno);
                goto bail;
        }
@@ -1420,17 +1420,17 @@
        php_any_addr(sa->sa_family, &addr, 0);
        size = php_sockaddr_size(&addr);
 
-       if (bind(fd, (struct sockaddr*) &addr, size) == -1) {
+       if (bind(fd, (struct sockaddr*) &addr, size) != 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "bind() failed: %s
(%d)", strerror(errno), errno);
                goto bail;
        }
 
-       if (getsockname(fd, (struct sockaddr*) &addr, &size) == -1) {
+       if (getsockname(fd, (struct sockaddr*) &addr, &size) != 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "getsockname() 
failed:
%s (%d)", strerror(errno), errno);
                goto bail;
        }
 
-       if (listen(fd, 5) == -1) {
+       if (listen(fd, 5) != 0) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "listen() failed: %s
(%d)", strerror(errno), errno);
                goto bail;
        }
Index: ext/sockets/sockets.c
===================================================================
--- ext/sockets/sockets.c       (revision 287975)
+++ ext/sockets/sockets.c       (working copy)
@@ -370,14 +370,14 @@
 
        sock->type = PF_INET;
 
-       if (bind(sock->bsd_socket, (struct sockaddr *)&la, sizeof(la)) < 0)
{
+       if (bind(sock->bsd_socket, (struct sockaddr *)&la, sizeof(la)) != 0)
{
                PHP_SOCKET_ERROR(sock, "unable to bind to given address", 
errno);
                close(sock->bsd_socket);
                efree(sock);
                return 0;
        }
 
-       if (listen(sock->bsd_socket, backlog) < 0) {
+       if (listen(sock->bsd_socket, backlog) != 0) {
                PHP_SOCKET_ERROR(sock, "unable to listen on socket", errno);
                close(sock->bsd_socket);
                efree(sock);
Index: main/network.c
===================================================================
--- main/network.c      (revision 287975)
+++ main/network.c      (working copy)
@@ -314,7 +314,7 @@
 
        SET_SOCKET_BLOCKING_MODE(sockfd, orig_flags);
        
-       if ((n = connect(sockfd, addr, addrlen)) < 0) {
+       if ((n = connect(sockfd, addr, addrlen)) != 0) {
                error = php_socket_errno();
 
                if (error_code) {
@@ -348,7 +348,7 @@
                   BSD-derived systems set errno correctly
                   Solaris returns -1 from getsockopt in case of error
                   */
-               if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char*)&error, 
&len) <
0) {
+               if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char*)&error, 
&len) !=
0) {
                        ret = -1;
                }
        } else {
@@ -375,7 +375,7 @@
        if (asynchronous) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Asynchronous 
connect()
not supported on this platform");
        }
-       return connect(sockfd, addr, addrlen);
+       return (connect(sockfd, addr, addrlen) == 0) ? 0 : -1;
 #endif
 }
 /* }}} */
@@ -715,7 +715,7 @@
 
                clisock = accept(srvsock, (struct sockaddr*)&sa, &sl);
 
-               if (clisock >= 0) {
+               if (clisock != SOCK_ERR) {
                        php_network_populate_name_from_sockaddr((struct 
sockaddr*)&sa, sl,
                                        textaddr, textaddrlen,
                                        addr, addrlen
@@ -867,7 +867,7 @@
                                        timeout ? &working_timeout : NULL,
                                        error_string, error_code);
 
-                       if (n != SOCK_CONN_ERR) {
+                       if (n != -1) {
                                goto connected;
                        }
 
Index: main/streams/xp_socket.c
===================================================================
--- main/streams/xp_socket.c    (revision 287975)
+++ main/streams/xp_socket.c    (working copy)
@@ -181,6 +181,10 @@
 
        if (close_handle) {
 
+#ifdef PHP_WIN32
+               if (sock->socket == -1)
+                       sock->socket = SOCK_ERR;
+#endif
                if (sock->socket != SOCK_ERR) {
 #ifdef PHP_WIN32
                        /* prevent more data from coming in */
@@ -312,7 +316,7 @@
 
                        switch (xparam->op) {
                                case STREAM_XPORT_OP_LISTEN:
-                                       xparam->outputs.returncode = 
listen(sock->socket, 5);
+                                       xparam->outputs.returncode = 
(listen(sock->socket, 5) == 0) ?  0:
-1;
                                        return PHP_STREAM_OPTION_RETURN_OK;
 
                                case STREAM_XPORT_OP_GET_NAME:

------------------------------------------------------------------------

[2009-09-03 01:36:03] sriram dot natarajan at gmail dot com

Description:
------------
Unlike bsd sockets, Win32 Socket API does not return -1 on failure for
most of the common socket api calls like bind, accept, connect etc. in
fact, the error status is another integer with numbers like 10035 etc. 
so, checking for returns status on these socket API's like -1 or <= 0
is wrong. 

i noticed this issue while debugging another problem on windows. hence,
filing this bug to track this issue . checking for correct error status
on these API is important during trouble shooting scenarios.



------------------------------------------------------------------------


-- 
Edit this bug report at http://bugs.php.net/?id=49447&edit=1

Reply via email to