]> granicus.if.org Git - php/commitdiff
- Fixed bug #49447 (php engine need to correctly check for socket API
authorSriram Natarajan <srinatar@php.net>
Fri, 4 Sep 2009 07:59:48 +0000 (07:59 +0000)
committerSriram Natarajan <srinatar@php.net>
Fri, 4 Sep 2009 07:59:48 +0000 (07:59 +0000)
  return status on windows). (Sriram Natarajan)

ext/ftp/ftp.c
ext/openssl/xp_ssl.c
ext/sockets/sockets.c
main/network.c
main/streams/xp_socket.c

index 50bea9a3e63bbce5c54b50d2ac3fcc2305184d3e..b916d1906374036fe08ee55d0fc9d6804d648595 100644 (file)
@@ -148,7 +148,7 @@ ftp_open(const char *host, short port, long timeout_sec TSRMLS_DC)
 
        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;
        }
@@ -1388,7 +1388,7 @@ ftp_getdata(ftpbuf_t *ftp TSRMLS_DC)
 
        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;
        }
@@ -1421,17 +1421,17 @@ ftp_getdata(ftpbuf_t *ftp TSRMLS_DC)
        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 ee41f369d2b117ddb6138f6078d428ba28937c48..3d122d6e2da8fb8da9d660dbcd0ff77b8f0f8a32 100644 (file)
@@ -259,6 +259,10 @@ static int php_openssl_sockop_close(php_stream *stream, int close_handle TSRMLS_
                        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 32f6eef1dd72b3836948d8c7d0208eda59d18dba..4a1b9be2f1d5d1976c4abb84376315eb4c6b9663 100644 (file)
@@ -370,14 +370,14 @@ static int php_open_listen_sock(php_socket **php_sock, int port, int backlog TSR
 
        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 f4954c3523613a4a1f7f5da2c8d1b1b13223209e..fe1c877d542444646b80c96912854398dec72743 100644 (file)
@@ -314,7 +314,7 @@ PHPAPI int php_network_connect_socket(php_socket_t sockfd,
 
        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 @@ PHPAPI int php_network_connect_socket(php_socket_t sockfd,
                   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 @@ ok:
        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 @@ PHPAPI php_socket_t php_network_accept_incoming(php_socket_t srvsock,
 
                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 @@ skip_bind:
                                        timeout ? &working_timeout : NULL,
                                        error_string, error_code);
 
-                       if (n != SOCK_CONN_ERR) {
+                       if (n != -1) {
                                goto connected;
                        }
 
index 48cb86c206a65416ce4cd55207ded9281f9f51b8..aee5a2abb5e6ff19a1da7efa5157c63b6f7bb79a 100644 (file)
@@ -181,6 +181,10 @@ static int php_sockop_close(php_stream *stream, int close_handle TSRMLS_DC)
 
        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 */
@@ -226,10 +230,12 @@ static inline int sock_sendto(php_netstream_data_t *sock, char *buf, size_t bufl
                struct sockaddr *addr, socklen_t addrlen
                TSRMLS_DC)
 {
+       int ret;
        if (addr) {
-               return sendto(sock->socket, buf, buflen, flags, addr, addrlen);
+               ret = sendto(sock->socket, buf, buflen, flags, addr, addrlen);
+               return (ret == SOCK_CONN_ERR) ? -1 : ret;
        }
-       return send(sock->socket, buf, buflen, flags);
+       return ((ret = send(sock->socket, buf, buflen, flags)) == SOCK_CONN_ERR) ? -1 : ret;
 }
 
 static inline int sock_recvfrom(php_netstream_data_t *sock, char *buf, size_t buflen, int flags,
@@ -244,10 +250,12 @@ static inline int sock_recvfrom(php_netstream_data_t *sock, char *buf, size_t bu
 
        if (want_addr) {
                ret = recvfrom(sock->socket, buf, buflen, flags, (struct sockaddr*)&sa, &sl);
+               ret = (ret == SOCK_CONN_ERR) ? -1 : ret;
                php_network_populate_name_from_sockaddr((struct sockaddr*)&sa, sl,
                        textaddr, textaddrlen, addr, addrlen TSRMLS_CC);
        } else {
                ret = recv(sock->socket, buf, buflen, flags);
+               ret = (ret == SOCK_CONN_ERR) ? -1 : ret;
        }
 
        return ret;
@@ -281,7 +289,7 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void
                                if (sock->socket == -1) {
                                        alive = 0;
                                } else if (php_pollfd_for(sock->socket, PHP_POLLREADABLE|POLLPRI, &tv) > 0) {
-                                       if (0 >= recv(sock->socket, &buf, sizeof(buf), MSG_PEEK) && php_socket_errno() != EWOULDBLOCK) {
+                                       if (recv(sock->socket, &buf, sizeof(buf), MSG_PEEK) != SOCK_CONN_ERR && php_socket_errno() != EWOULDBLOCK) {
                                                alive = 0;
                                        }
                                }
@@ -312,7 +320,7 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void
 
                        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: