- fixed memory corruption
[m6w6/ext-http] / http_send_api.c
index 6dfc677f993b5be0eef58657c291506311b986c8..f22a3d1fd398fb2a3e75ee46ff926accb5523659 100644 (file)
@@ -158,7 +158,11 @@ PHP_HTTP_API STATUS _http_send_header_ex(const char *name, size_t name_len, cons
        header[header_len] = '\0';
        snprintf(header, header_len, "%s: %s", name, value);
        ret = http_send_header_string_ex(header, replace);
-       efree(header);
+       if (sent_header) {
+               *sent_header = header;
+       } else {
+               efree(header);
+       }
        return ret;
 }
 /* }}} */
@@ -185,7 +189,7 @@ PHP_HTTP_API STATUS _http_send_last_modified_ex(time_t t, char **sent_header TSR
                return FAILURE;
        }
 
-       ret = http_send_header_ex("Last-Modified", lenof("Last-Modifed"), date, strlen(date), 1, sent_header);
+       ret = http_send_header_ex("Last-Modified", lenof("Last-Modified"), date, strlen(date), 1, sent_header);
        efree(date);
 
        /* remember */
@@ -289,6 +293,7 @@ PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_
 
        /* multi range */
        else {
+               size_t preface_len;
                char bound[23] = {0}, preface[1024] = {0},
                        multi_header[68] = "Content-Type: multipart/byteranges; boundary=";
 
@@ -307,7 +312,7 @@ PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_
                                break;
                        }
 
-                       snprintf(preface, 1023,
+                       preface_len = snprintf(preface, 1023,
                                HTTP_CRLF "%s"
                                HTTP_CRLF "Content-Type: %s"
                                HTTP_CRLF "Content-Range: bytes %ld-%ld/%lu"
@@ -321,7 +326,7 @@ PHP_HTTP_API STATUS _http_send_ranges(HashTable *ranges, const void *data, size_
                                (ulong) size
                        );
 
-                       PHPWRITE(preface, strlen(preface));
+                       PHPWRITE(preface, preface_len);
                        http_send_chunk(data, Z_LVAL_PP(zbegin), Z_LVAL_PP(zend) + 1, mode);
                }
 
@@ -350,10 +355,7 @@ PHP_HTTP_API STATUS _http_send_ex(const void *data_ptr, size_t data_size, http_s
        }
 
        /* stop on-the-fly etag generation */
-       if (cache_etag = HTTP_G(etag).started) {
-               /* interrupt ob_etaghandler */
-               HTTP_G(etag).started = 0;
-       }
+       cache_etag = http_interrupt_ob_etaghandler();
 
        /* enable partial dl and resume */
        http_send_header_string("Accept-Ranges: bytes");
@@ -382,13 +384,11 @@ PHP_HTTP_API STATUS _http_send_ex(const void *data_ptr, size_t data_size, http_s
        /* send 304 Not Modified if etag matches - DON'T return on ETag generation failure */
        if (!no_cache && cache_etag) {
                char *etag = NULL;
-
-               if (!(etag = http_etag(data_ptr, data_size, data_mode))) {
-                       http_error(HE_NOTICE, HTTP_E_RUNTIME, "Failed to generate ETag for data source");
-               } else {
+               
+               if (etag = http_etag(data_ptr, data_size, data_mode)) {
                        char *sent_header = NULL;
                        
-                       http_send_etag_ex(etag, 32, &sent_header);
+                       http_send_etag_ex(etag, strlen(etag), &sent_header);
                        if (http_match_etag("HTTP_IF_NONE_MATCH", etag)) {
                                return http_exit_ex(304, sent_header, NULL, 0);
                        } else {