]> granicus.if.org Git - php/commitdiff
Only call stream_flush if anything was written
authorBob Weinand <bobwei9@hotmail.com>
Tue, 30 Jun 2015 01:49:54 +0000 (03:49 +0200)
committerBob Weinand <bobwei9@hotmail.com>
Tue, 30 Jun 2015 01:49:54 +0000 (03:49 +0200)
This avoids flushing in readonly mode upon close

main/php_streams.h
main/streams/streams.c

index 0ee3ff545888401c85930000421a7a8e54fec26a..81822a7076909511c346423e32e05f29ac1a741b 100644 (file)
@@ -166,24 +166,26 @@ struct _php_stream_wrapper        {
        int is_url;                                             /* so that PG(allow_url_fopen) can be respected */
 };
 
-#define PHP_STREAM_FLAG_NO_SEEK                                                1
-#define PHP_STREAM_FLAG_NO_BUFFER                                      2
+#define PHP_STREAM_FLAG_NO_SEEK                                                0x1
+#define PHP_STREAM_FLAG_NO_BUFFER                                      0x2
 
-#define PHP_STREAM_FLAG_EOL_UNIX                                       0 /* also includes DOS */
-#define PHP_STREAM_FLAG_DETECT_EOL                                     4
-#define PHP_STREAM_FLAG_EOL_MAC                                                8
+#define PHP_STREAM_FLAG_EOL_UNIX                                       0x0 /* also includes DOS */
+#define PHP_STREAM_FLAG_DETECT_EOL                                     0x4
+#define PHP_STREAM_FLAG_EOL_MAC                                                0x8
 
 /* set this when the stream might represent "interactive" data.
  * When set, the read buffer will avoid certain operations that
  * might otherwise cause the read to block for much longer than
  * is strictly required. */
-#define PHP_STREAM_FLAG_AVOID_BLOCKING                         16
+#define PHP_STREAM_FLAG_AVOID_BLOCKING                                 0x10
 
-#define PHP_STREAM_FLAG_NO_CLOSE                                       32
+#define PHP_STREAM_FLAG_NO_CLOSE                                       0x20
 
-#define PHP_STREAM_FLAG_IS_DIR                                         64
+#define PHP_STREAM_FLAG_IS_DIR                                         0x40
 
-#define PHP_STREAM_FLAG_NO_FCLOSE                                      128
+#define PHP_STREAM_FLAG_NO_FCLOSE                                      0x80
+
+#define PHP_STREAM_FLAG_WAS_WRITTEN                                    0x80000000
 
 struct _php_stream  {
        php_stream_ops *ops;
index b6a2887cfd145bf59d5573376dd54a55de617d72..e8fa1e89b391596a28bb427a323d73857a23a0bf 100644 (file)
@@ -434,8 +434,10 @@ fprintf(stderr, "stream_free: %s:%p[%s] preserve_handle=%d release_cast=%d remov
                (close_options & PHP_STREAM_FREE_RSRC_DTOR) == 0);
 #endif
 
-       /* make sure everything is saved */
-       _php_stream_flush(stream, 1);
+       if (stream->flags & PHP_STREAM_FLAG_WAS_WRITTEN) {
+               /* make sure everything is saved */
+               _php_stream_flush(stream, 1);
+       }
 
        /* If not called from the resource dtor, remove the stream from the resource list. */
        if ((close_options & PHP_STREAM_FREE_RSRC_DTOR) == 0 && stream->res) {
@@ -1205,6 +1207,8 @@ PHPAPI int _php_stream_flush(php_stream *stream, int closing)
                _php_stream_write_filtered(stream, NULL, 0, closing ? PSFS_FLAG_FLUSH_CLOSE : PSFS_FLAG_FLUSH_INC );
        }
 
+       stream->flags &= ~PHP_STREAM_FLAG_WAS_WRITTEN;
+
        if (stream->ops->flush) {
                ret = stream->ops->flush(stream);
        }
@@ -1214,15 +1218,23 @@ PHPAPI int _php_stream_flush(php_stream *stream, int closing)
 
 PHPAPI size_t _php_stream_write(php_stream *stream, const char *buf, size_t count)
 {
+       size_t bytes;
+
        if (buf == NULL || count == 0 || stream->ops->write == NULL) {
                return 0;
        }
 
        if (stream->writefilters.head) {
-               return _php_stream_write_filtered(stream, buf, count, PSFS_FLAG_NORMAL);
+               bytes = _php_stream_write_filtered(stream, buf, count, PSFS_FLAG_NORMAL);
        } else {
-               return _php_stream_write_buffer(stream, buf, count);
+               bytes = _php_stream_write_buffer(stream, buf, count);
        }
+
+       if (bytes) {
+               stream->flags |= PHP_STREAM_FLAG_WAS_WRITTEN;
+       }
+
+       return bytes;
 }
 
 PHPAPI size_t _php_stream_printf(php_stream *stream, const char *fmt, ...)