- (non-)ZTS fixes
[m6w6/ext-http] / http_encoding_api.c
index 178c9925a34de64e760fa1aec9f715edef816c9c..06a175ff6a1e11478631f1ee6b13e69ca7fbf49e 100644 (file)
@@ -238,24 +238,21 @@ static inline int http_inflate_rounds(z_stream *Z, int flush, char **buf, size_t
                if (PHPSTR_NOMEM == phpstr_resize_ex(&buffer, buffer.size, 0, 1)) {
                        status = Z_MEM_ERROR;
                } else {
-                       do {
-                               Z->avail_out = buffer.free;
-                               Z->next_out = (Bytef *) buffer.data + buffer.used;
+                       Z->avail_out = buffer.free;
+                       Z->next_out = (Bytef *) buffer.data + buffer.used;
 #if 0
-                               fprintf(stderr, "PRIOR: size=%lu, avail=%lu, used=%lu, (%d/%d)\n", buffer.size, Z->avail_out, buffer.used, status, round);
+                       fprintf(stderr, "\n%3d: %3d PRIOR: size=%7lu,\tfree=%7lu,\tused=%7lu,\tavail_in=%7lu,\tavail_out=%7lu\n", round, status, buffer.size, buffer.free, buffer.used, Z->avail_in, Z->avail_out);
 #endif
-                               status = inflate(Z, flush);
+                       status = inflate(Z, flush);
                        
-                               buffer.used += buffer.free - Z->avail_out;
-                               buffer.free = Z->avail_out;
+                       buffer.used += buffer.free - Z->avail_out;
+                       buffer.free = Z->avail_out;
 #if 0
-                               fprintf(stderr, "AFTER: size=%lu, avail=%lu, used=%lu, (%d/%d)\n", buffer.size, Z->avail_out, buffer.used, status, round);
+                       fprintf(stderr, "%3d: %3d AFTER: size=%7lu,\tfree=%7lu,\tused=%7lu,\tavail_in=%7lu,\tavail_out=%7lu\n", round, status, buffer.size, buffer.free, buffer.used, Z->avail_in, Z->avail_out);
 #endif
-                       } while (Z_OK == status && Z->avail_in);
-                       
                        HTTP_INFLATE_BUFFER_SIZE_ALIGN(buffer.size);
                }
-       } while (Z_BUF_ERROR == status && ++round < HTTP_INFLATE_ROUNDS);
+       } while ((Z_BUF_ERROR == status || (Z_OK == status && Z->avail_in)) && ++round < HTTP_INFLATE_ROUNDS);
        
        if (status == Z_OK || status == Z_STREAM_END) {
                phpstr_shrink(&buffer);
@@ -330,6 +327,7 @@ retry_raw_inflate:
                switch (status = http_inflate_rounds(&Z, Z_NO_FLUSH, decoded, decoded_len)) {
                        case Z_OK:
                        case Z_STREAM_END:
+                               inflateEnd(&Z);
                                return SUCCESS;
                        
                        case Z_DATA_ERROR:
@@ -571,6 +569,12 @@ PHP_HTTP_API STATUS _http_encoding_inflate_stream_finish(http_encoding_stream *s
 {
        int status;
        
+       if (!PHPSTR_LEN(s->stream.opaque)) {
+               *decoded = NULL;
+               *decoded_len = 0;
+               return SUCCESS;
+       }
+       
        *decoded_len = (PHPSTR_LEN(s->stream.opaque) + 1) * HTTP_INFLATE_ROUNDS;
        *decoded = emalloc_rel(*decoded_len);