less intrusive fix
[m6w6/ext-http] / php_http_buffer.c
index 84e5bbdc39d6f592aa1fd29969a7cd7fdb955738..bd99dc84f1677ce2a766b2c215796691719c7117 100644 (file)
@@ -1,13 +1,22 @@
-
-/* $Id: php_http_buffer_t.c 211942 2006-04-24 17:17:09Z mike $ */
-
-#include "php.h"
+/*
+    +--------------------------------------------------------------------+
+    | PECL :: http                                                       |
+    +--------------------------------------------------------------------+
+    | Redistribution and use in source and binary forms, with or without |
+    | modification, are permitted provided that the conditions mentioned |
+    | in the accompanying LICENSE file are met.                          |
+    +--------------------------------------------------------------------+
+    | Copyright (c) 2004-2011, Michael Wallner <mike@php.net>            |
+    +--------------------------------------------------------------------+
+*/
+
+#include <php.h>
 #include "php_http_buffer.h"
 
 PHP_HTTP_BUFFER_API php_http_buffer_t *php_http_buffer_init_ex(php_http_buffer_t *buf, size_t chunk_size, int flags)
 {
        if (!buf) {
-               buf = pemalloc(sizeof(php_http_buffer_t), flags & PHP_HTTP_BUFFER_INIT_PERSISTENT);
+               buf = pemalloc(sizeof(*buf), flags & PHP_HTTP_BUFFER_INIT_PERSISTENT);
        }
 
        if (buf) {
@@ -375,22 +384,22 @@ PHP_HTTP_BUFFER_API void php_http_buffer_chunked_output(php_http_buffer_t **s, c
        STR_FREE(chunk);
 }
 
-PHP_HTTP_BUFFER_API ssize_t php_http_buffer_passthru(php_http_buffer_t *s, size_t chunk_size, php_http_buffer_pass_func_t passin, void *passin_arg, php_http_buffer_pass_func_t passon, void *passon_arg TSRMLS_DC)
+PHP_HTTP_BUFFER_API ssize_t php_http_buffer_passthru(php_http_buffer_t **s, size_t chunk_size, php_http_buffer_pass_func_t passin, void *passin_arg, php_http_buffer_pass_func_t passon, void *passon_arg TSRMLS_DC)
 {
-       size_t passed_on = 0, passed_in = php_http_buffer_chunked_input(&s, chunk_size, passin, passin_arg TSRMLS_CC);
+       size_t passed_on = 0, passed_in = php_http_buffer_chunked_input(s, chunk_size, passin, passin_arg TSRMLS_CC);
 
        if (passed_in == PHP_HTTP_BUFFER_PASS0) {
                return passed_in;
        }
-       if (passed_in) {
-               passed_on = passon(passon_arg, s->data, passed_in TSRMLS_CC);
+       if (passed_in || (*s)->used) {
+               passed_on = passon(passon_arg, (*s)->data, (*s)->used TSRMLS_CC);
 
                if (passed_on == PHP_HTTP_BUFFER_PASS0) {
                        return passed_on;
                }
 
                if (passed_on) {
-                       php_http_buffer_cut(s, 0, passed_on);
+                       php_http_buffer_cut(*s, 0, passed_on);
                }
        }