]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-5.6'
authorAnatol Belski <ab@php.net>
Mon, 29 Sep 2014 14:30:40 +0000 (16:30 +0200)
committerAnatol Belski <ab@php.net>
Mon, 29 Sep 2014 14:30:40 +0000 (16:30 +0200)
* PHP-5.6:
  updated NEWS
  Fixed bug #51800 proc_open on Windows hangs forever

Conflicts:
main/streams/plain_wrapper.c

1  2 
main/streams/plain_wrapper.c

index 2b8dcc478e108c523cf2c56084fd6ef1aad2a4db,1969401111c6cfd9b86ec4b2c1cb0dc7508b3b19..8f0b9811006ba3c78dc3ba76b605a111e25246de
@@@ -348,7 -342,35 +348,35 @@@ static size_t php_stdiop_read(php_strea
        assert(data != NULL);
  
        if (data->fd >= 0) {
 -              ret = read(data->fd, buf, count);
+ #ifdef PHP_WIN32
+               php_stdio_stream_data *self = (php_stdio_stream_data*)stream->abstract;
+               if (self->is_pipe || self->is_process_pipe) {
+                       HANDLE ph = (HANDLE)_get_osfhandle(data->fd);
+                       int retry = 0;
+                       DWORD avail_read = 0;
+                       do {
+                               /* Look ahead to get the available data amount to read. Do the same
+                                       as read() does, however not blocking forever. In case it failed,
+                                       no data will be read (better than block). */
+                               if (!PeekNamedPipe(ph, NULL, 0, NULL, &avail_read, NULL)) {
+                                       break;
+                               }
+                               /* If there's nothing to read, wait in 100ms periods. */
+                               if (0 == avail_read) {
+                                       usleep(100000);
+                               }
+                       } while (0 == avail_read && retry++ < 180);
+                       /* Reduce the required data amount to what is available, otherwise read()
+                               will block.*/
+                       if (avail_read < count) {
+                               count = avail_read;
+                       }
+               }
+ #endif
 +              ret = read(data->fd, buf,  PLAIN_WRAP_BUF_SIZE(count));
  
                if (ret == (size_t)-1 && errno == EINTR) {
                        /* Read was interrupted, retry once,