summaryrefslogtreecommitdiff
path: root/main/network.c
diff options
context:
space:
mode:
authorWez Furlong <wez@php.net>2002-10-13 23:43:21 +0000
committerWez Furlong <wez@php.net>2002-10-13 23:43:21 +0000
commit0bcd2ccb2cb487ac47a065a9c07c85e7f21ebbbd (patch)
treeb7d5b21e91e93eec2a1f38a25b6f7befdd17c5c9 /main/network.c
parentbc0948bbdaa863420c1663cc6f3679be3e4bb2eb (diff)
downloadphp-git-0bcd2ccb2cb487ac47a065a9c07c85e7f21ebbbd.tar.gz
A much better probable fix for #16114.
Diffstat (limited to 'main/network.c')
-rw-r--r--main/network.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/main/network.c b/main/network.c
index 983d77b0ef..f973462b08 100644
--- a/main/network.c
+++ b/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);
}