From cedd7ef4bf0951128cea4fb9969e1b2ef0233607 Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Mon, 19 May 2003 23:27:49 +0000 Subject: [PATCH] Fix refcounting problem with contexts. Also, potentially fix stream_set_timeout issues on SSL streams. --- ext/standard/file.c | 5 +++-- ext/standard/fsock.c | 5 ++++- main/network.c | 17 ++++++++++++++--- main/streams.c | 4 ++++ 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/ext/standard/file.c b/ext/standard/file.c index 66bc863005..bcde4a0c6d 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -1110,8 +1110,9 @@ PHP_NAMED_FUNCTION(php_if_fopen) } php_stream_to_zval(stream, return_value); - - return; + if (zcontext) { + ZVAL_ADDREF(zcontext); + } } /* }}} */ diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index adb7d55cb9..9a5a821c8e 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -279,7 +279,10 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) } RETURN_FALSE; } - + + if (zcontext) { + ZVAL_ADDREF(zcontext); + } php_stream_to_zval(stream, return_value); } diff --git a/main/network.c b/main/network.c index c0c9010d47..3c84f64ecf 100644 --- a/main/network.c +++ b/main/network.c @@ -917,8 +917,9 @@ static size_t php_sockop_write(php_stream *stream, const char *buf, size_t count } } - if (didwrite > 0) + if (didwrite > 0) { php_stream_notify_progress_increment(stream->context, didwrite, 0); + } return didwrite; } @@ -975,6 +976,13 @@ static size_t php_sockop_read(php_stream *stream, char *buf, size_t count TSRMLS if (sock->ssl_active) { int retry = 1; + if (sock->is_blocked && !SSL_pending(sock->ssl_handle)) { + php_sock_stream_wait_for_data(stream, sock TSRMLS_CC); + if (sock->timeout_event) { + return 0; + } + } + do { nr_bytes = SSL_read(sock->ssl_handle, buf, count); @@ -994,8 +1002,9 @@ static size_t php_sockop_read(php_stream *stream, char *buf, size_t count TSRMLS { if (sock->is_blocked) { php_sock_stream_wait_for_data(stream, sock TSRMLS_CC); - if (sock->timeout_event) + if (sock->timeout_event) { return 0; + } } nr_bytes = recv(sock->socket, buf, count, 0); @@ -1005,8 +1014,9 @@ static size_t php_sockop_read(php_stream *stream, char *buf, size_t count TSRMLS } } - if (nr_bytes > 0) + if (nr_bytes > 0) { php_stream_notify_progress_increment(stream->context, nr_bytes, 0); + } return nr_bytes; } @@ -1126,6 +1136,7 @@ int _php_network_is_stream_alive(php_stream *stream) } } } + return alive; } diff --git a/main/streams.c b/main/streams.c index 585716bae6..0cb591ecef 100755 --- a/main/streams.c +++ b/main/streams.c @@ -125,6 +125,10 @@ fprintf(stderr, "forget_persistent: %s:%p\n", stream->ops->label, stream); stream->rsrc_id = FAILURE; + if (stream->context) { + stream->context = NULL; + } + return 0; } -- 2.50.1