Skip to content

Commit 30a7365

Browse files
committed
Merge branch 'PHP-5.4' into PHP-5.5
* PHP-5.4: Fix stream_select() issue with OpenSSL buffer Conflicts: ext/openssl/xp_ssl.c
2 parents 7fac56e + 32be79d commit 30a7365

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

ext/openssl/xp_ssl.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,19 @@ static int php_openssl_sockop_cast(php_stream *stream, int castas, void **ret TS
881881

882882
case PHP_STREAM_AS_FD_FOR_SELECT:
883883
if (ret) {
884+
if (sslsock->ssl_active) {
885+
/* OpenSSL has an internal buffer which select() cannot see. If we don't
886+
fetch it into the stream's buffer, no activity will be reported on the
887+
stream even though there is data waiting to be read - but we only fetch
888+
the number of bytes OpenSSL has ready to give us since we weren't asked
889+
for any data at this stage. This is only likely to cause issues with
890+
non-blocking streams, but it's harmless to always do it. */
891+
int bytes;
892+
while ((bytes = SSL_pending(sslsock->ssl_handle)) > 0) {
893+
php_stream_fill_read_buffer(stream, (size_t)bytes);
894+
}
895+
}
896+
884897
*(php_socket_t *)ret = sslsock->s.socket;
885898
}
886899
return SUCCESS;

main/php_streams.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,9 @@ PHPAPI size_t _php_stream_write(php_stream *stream, const char *buf, size_t coun
297297
#define php_stream_write_string(stream, str) _php_stream_write(stream, str, strlen(str) TSRMLS_CC)
298298
#define php_stream_write(stream, buf, count) _php_stream_write(stream, (buf), (count) TSRMLS_CC)
299299

300+
PHPAPI void _php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_DC);
301+
#define php_stream_fill_read_buffer(stream, size) _php_stream_fill_read_buffer((stream), (size) TSRMLS_CC)
302+
300303
#ifdef ZTS
301304
PHPAPI size_t _php_stream_printf(php_stream *stream TSRMLS_DC, const char *fmt, ...) PHP_ATTRIBUTE_FORMAT(printf, 3, 4);
302305
#else

main/streams/streams.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,7 @@ fprintf(stderr, "stream_free: %s:%p[%s] preserve_handle=%d release_cast=%d remov
568568

569569
/* {{{ generic stream operations */
570570

571-
static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_DC)
571+
PHPAPI void _php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_DC)
572572
{
573573
/* allocate/fill the buffer */
574574

@@ -736,7 +736,7 @@ PHPAPI size_t _php_stream_read(php_stream *stream, char *buf, size_t size TSRMLS
736736
break;
737737
}
738738
} else {
739-
php_stream_fill_read_buffer(stream, size TSRMLS_CC);
739+
php_stream_fill_read_buffer(stream, size);
740740

741741
toread = stream->writepos - stream->readpos;
742742
if (toread > size) {
@@ -972,7 +972,7 @@ PHPAPI char *_php_stream_get_line(php_stream *stream, char *buf, size_t maxlen,
972972
}
973973
}
974974

975-
php_stream_fill_read_buffer(stream, toread TSRMLS_CC);
975+
php_stream_fill_read_buffer(stream, toread);
976976

977977
if (stream->writepos - stream->readpos == 0) {
978978
break;
@@ -1047,7 +1047,7 @@ PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *re
10471047

10481048
to_read_now = MIN(maxlen - buffered_len, stream->chunk_size);
10491049

1050-
php_stream_fill_read_buffer(stream, buffered_len + to_read_now TSRMLS_CC);
1050+
php_stream_fill_read_buffer(stream, buffered_len + to_read_now);
10511051

10521052
just_read = STREAM_BUFFERED_AMOUNT(stream) - buffered_len;
10531053

0 commit comments

Comments
 (0)