]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-5.4' into PHP-5.5
authorChris Wright <daverandom@php.net>
Wed, 27 Aug 2014 15:01:18 +0000 (16:01 +0100)
committerChris Wright <daverandom@php.net>
Wed, 27 Aug 2014 15:01:18 +0000 (16:01 +0100)
* PHP-5.4:
  Fix stream_select() issue with OpenSSL buffer

Conflicts:
ext/openssl/xp_ssl.c

1  2 
ext/openssl/xp_ssl.c
main/php_streams.h
main/streams/streams.c

index 5fddf73c4ea29462f4df9e7f363af0ea80e4ba7b,956ffd0547fe4aa2a67d24551d8f7ffaf448deea..79d4a09f66130756ef22747b64edb84681fcea50
@@@ -881,7 -871,20 +881,20 @@@ static int php_openssl_sockop_cast(php_
  
                case PHP_STREAM_AS_FD_FOR_SELECT:
                        if (ret) {
 -                              *(int *)ret = sslsock->s.socket;
+                               if (sslsock->ssl_active) {
+                                       /* OpenSSL has an internal buffer which select() cannot see. If we don't
+                                          fetch it into the stream's buffer, no activity will be reported on the
+                                          stream even though there is data waiting to be read - but we only fetch
+                                          the number of bytes OpenSSL has ready to give us since we weren't asked
+                                          for any data at this stage. This is only likely to cause issues with
+                                          non-blocking streams, but it's harmless to always do it. */
+                                       int bytes;
+                                       while ((bytes = SSL_pending(sslsock->ssl_handle)) > 0) {
+                                               php_stream_fill_read_buffer(stream, (size_t)bytes);
+                                       }
+                               }
 +                              *(php_socket_t *)ret = sslsock->s.socket;
                        }
                        return SUCCESS;
  
Simple merge
Simple merge