ID: 49447 Updated by: srina...@php.net Reported By: sriram dot natarajan at gmail dot com -Status: Assigned +Status: Closed Bug Type: Sockets related Operating System: win32 only - windows xp PHP Version: 5.3.0 Assigned To: srinatar New Comment:
This bug has been fixed in SVN. Snapshots of the sources are packaged every three hours; this change will be in the next snapshot. You can grab the snapshot at http://snaps.php.net/. Thank you for the report, and for helping us make PHP better. fix for this issue has been integrated Previous Comments: ------------------------------------------------------------------------ [2009-09-04 07:59:49] s...@php.net Automatic comment from SVN on behalf of srinatar Revision: http://svn.php.net/viewvc/?view=revision&revision=288034 Log: - Fixed bug #49447 (php engine need to correctly check for socket API return status on windows). (Sriram Natarajan) ------------------------------------------------------------------------ [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