Browse Source

A much better probable fix for #16114.

migration/unlabaled-1.29.2
Wez Furlong 24 years ago
parent
commit
0bcd2ccb2c
  1. 15
      main/network.c
  2. 11
      main/php_network.h

15
main/network.c

@ -849,6 +849,8 @@ static size_t php_sockop_read(php_stream *stream, char *buf, size_t count TSRMLS
static int php_sockop_close(php_stream *stream, int close_handle TSRMLS_DC)
{
php_netstream_data_t *sock = (php_netstream_data_t*)stream->abstract;
fd_set wrfds, efds;
int n;
if (close_handle) {
#if HAVE_OPENSSL_EXT
@ -862,7 +864,18 @@ static int php_sockop_close(php_stream *stream, int close_handle TSRMLS_DC)
}
#endif
/* shutdown(sock->socket, 0); */
/* prevent more data from coming in */
shutdown(sock->socket, SHUT_RD);
/* make sure that the OS sends all data before we close the connection */
do {
FD_ZERO(&wrfds);
FD_SET(sock->socket, &wrfds);
efds = wrfds;
n = select(sock->socket + 1, NULL, &wrfds, &efds, NULL);
} while (n == -1 && php_socket_errno() == EINTR);
closesocket(sock->socket);
}

11
main/php_network.h

@ -27,6 +27,9 @@
# undef FD_SETSIZE
# include "arpa/inet.h"
# define socklen_t unsigned int
# define SHUT_RD SD_RECEIVE
# define SHUT_WR SD_SEND
# define SHUT_RDWR SD_BOTH
#else
# undef closesocket
# define closesocket close
@ -62,6 +65,14 @@ PHPAPI char *php_socket_strerror(long err, char *buf, size_t bufsize);
#include <sys/socket.h>
#endif
/* These are here, rather than with the win32 counterparts above,
* since <sys/socket.h> defines them. */
#ifndef SHUT_RD
# define SHUT_RD 0
# define SHUT_WR 1
# define SHUT_RDWR 2
#endif
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif

Loading…
Cancel
Save