use heap instead of stack
authorMichael Wallner <mike@php.net>
Mon, 26 Apr 2010 11:47:29 +0000 (11:47 +0000)
committerMichael Wallner <mike@php.net>
Mon, 26 Apr 2010 11:47:29 +0000 (11:47 +0000)
http_api.c
http_encoding_api.c
http_send_api.c

index 5599ef5db845224961abc685fa3ad2375d56a70d..aca90e669f5adeed209212cb1fbbc86bb34827e1 100644 (file)
@@ -350,12 +350,12 @@ PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_
                }
                return SUCCESS;
        } else if (sapi_module.read_post && !HTTP_G->read_post_data) {
                }
                return SUCCESS;
        } else if (sapi_module.read_post && !HTTP_G->read_post_data) {
-               char buf[4096];
+               char *buf = emalloc(4096);
                int len;
                
                HTTP_G->read_post_data = 1;
                
                int len;
                
                HTTP_G->read_post_data = 1;
                
-               while (0 < (len = sapi_module.read_post(buf, sizeof(buf) TSRMLS_CC))) {
+               while (0 < (len = sapi_module.read_post(buf, 4096 TSRMLS_CC))) {
                        *body = erealloc(*body, *length + len + 1);
                        memcpy(*body + *length, buf, len);
                        *length += len;
                        *body = erealloc(*body, *length + len + 1);
                        memcpy(*body + *length, buf, len);
                        *length += len;
@@ -364,6 +364,7 @@ PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_
                                break;
                        }
                }
                                break;
                        }
                }
+               efree(buf);
                
                /* check for error */
                if (len < 0) {
                
                /* check for error */
                if (len < 0) {
@@ -396,15 +397,16 @@ PHP_HTTP_API php_stream *_http_get_request_body_stream(TSRMLS_D)
                HTTP_G->read_post_data = 1;
                
                if ((s = php_stream_temp_new())) {
                HTTP_G->read_post_data = 1;
                
                if ((s = php_stream_temp_new())) {
-                       char buf[4096];
+                       char *buf = emalloc(4096);
                        int len;
                        
                        int len;
                        
-                       while (0 < (len = sapi_module.read_post(buf, sizeof(buf) TSRMLS_CC))) {
+                       while (0 < (len = sapi_module.read_post(buf, 4096 TSRMLS_CC))) {
                                php_stream_write(s, buf, len);
                                if (len < (int) sizeof(buf)) {
                                        break;
                                }
                        }
                                php_stream_write(s, buf, len);
                                if (len < (int) sizeof(buf)) {
                                        break;
                                }
                        }
+                       efree(buf);
                        
                        if (len < 0) {
                                php_stream_close(s);
                        
                        if (len < 0) {
                                php_stream_close(s);
index 9e0976c58d2b33c5511d80a88cd7b7f3e4b931f7..8ce0280ca22c5e0911d2e5115674f972b47ba27f 100644 (file)
@@ -211,10 +211,13 @@ PHP_HTTP_API int _http_encoding_response_start(size_t content_length, zend_bool
 #endif /* HTTP_HAVE_ZLIB */
        } else if (content_length && !ohandler) {
                /* emit a content-length header */
 #endif /* HTTP_HAVE_ZLIB */
        } else if (content_length && !ohandler) {
                /* emit a content-length header */
-               char cl_header_str[128];
-               size_t cl_header_len;
-               cl_header_len = snprintf(cl_header_str, sizeof(cl_header_str), "Content-Length: %zu", content_length);
-               http_send_header_string_ex(cl_header_str, cl_header_len, 1);
+               phpstr header;
+
+               phpstr_init(&header);
+               phpstr_appendf(&header, "Content-Length: %zu", content_length);
+               phpstr_fix(&header);
+               http_send_header_string_ex(PHPSTR_VAL(&header), PHPSTR_LEN(&header), 1);
+               phpstr_dtor(&header);
        } else {
                HTTP_G->send.deflate.encoding = 0;
        }
        } else {
                HTTP_G->send.deflate.encoding = 0;
        }
index 92058d4a4ca4da31dcd3896b82f804eca11236be..319c7d6285a8c9da350e12a509c0bf8844a3f06f 100644 (file)
@@ -394,11 +394,13 @@ PHP_HTTP_API STATUS _http_send_ex(const void *data_ptr, size_t data_size, http_s
                                        http_send_status(500);
                                        return FAILURE;
                                } else {
                                        http_send_status(500);
                                        return FAILURE;
                                } else {
-                                       char range_header_str[256];
-                                       size_t range_header_len;
-                                       
-                                       range_header_len = snprintf(range_header_str, sizeof(range_header_str), "Content-Range: bytes %ld-%ld/%zu", Z_LVAL_PP(begin), Z_LVAL_PP(end), data_size);
-                                       http_send_status_header_ex(206, range_header_str, range_header_len, 1);
+                                       phpstr header;
+
+                                       phpstr_init(&header);
+                                       phpstr_appendf(&header, "Content-Range: bytes %ld-%ld/%zu", Z_LVAL_PP(begin), Z_LVAL_PP(end), data_size);
+                                       phpstr_fix(&header);
+                                       http_send_status_header_ex(206, PHPSTR_VAL(&header), PHPSTR_LEN(&header), 1);
+                                       phpstr_dtor(&header);
                                        http_send_response_start(&s, Z_LVAL_PP(end)-Z_LVAL_PP(begin)+1);
                                        http_send_response_data_fetch(&s, data_ptr, data_size, data_mode, Z_LVAL_PP(begin), Z_LVAL_PP(end) + 1);
                                        http_send_response_finish(&s);
                                        http_send_response_start(&s, Z_LVAL_PP(end)-Z_LVAL_PP(begin)+1);
                                        http_send_response_data_fetch(&s, data_ptr, data_size, data_mode, Z_LVAL_PP(begin), Z_LVAL_PP(end) + 1);
                                        http_send_response_finish(&s);
@@ -410,36 +412,41 @@ PHP_HTTP_API STATUS _http_send_ex(const void *data_ptr, size_t data_size, http_s
                                HashPosition pos;
                                zval **range, **begin, **end;
                                const char *content_type = HTTP_G->send.content_type;
                                HashPosition pos;
                                zval **range, **begin, **end;
                                const char *content_type = HTTP_G->send.content_type;
-                               char boundary_str[32], range_header_str[256];
-                               size_t boundary_len, range_header_len;
+                               char boundary_str[32];
+                               size_t boundary_len;
+                               phpstr header, preface;
                                
                                boundary_len = http_boundary(boundary_str, sizeof(boundary_str));
                                
                                boundary_len = http_boundary(boundary_str, sizeof(boundary_str));
-                               range_header_len = snprintf(range_header_str, sizeof(range_header_str), "Content-Type: multipart/byteranges; boundary=%s", boundary_str);
-                               
-                               http_send_status_header_ex(206, range_header_str, range_header_len, 1);
+                               phpstr_init(&header);
+                               phpstr_appendf(&header, "Content-Type: multipart/byteranges; boundary=%s", boundary_str);
+                               phpstr_fix(&header);
+                               http_send_status_header_ex(206, PHPSTR_VAL(&header), PHPSTR_LEN(&header), 1);
+                               phpstr_dtor(&header);
                                http_send_response_start(&s, 0);
                                
                                if (!content_type) {
                                        content_type = "application/x-octetstream";
                                }
                                http_send_response_start(&s, 0);
                                
                                if (!content_type) {
                                        content_type = "application/x-octetstream";
                                }
-                               
+
+                               phpstr_init(&preface);
                                FOREACH_HASH_VAL(pos, &ranges, range) {
                                        if (    SUCCESS == zend_hash_index_find(Z_ARRVAL_PP(range), 0, (void *) &begin) &&
                                                        SUCCESS == zend_hash_index_find(Z_ARRVAL_PP(range), 1, (void *) &end)) {
                                FOREACH_HASH_VAL(pos, &ranges, range) {
                                        if (    SUCCESS == zend_hash_index_find(Z_ARRVAL_PP(range), 0, (void *) &begin) &&
                                                        SUCCESS == zend_hash_index_find(Z_ARRVAL_PP(range), 1, (void *) &end)) {
-                                               char preface_str[512];
-                                               size_t preface_len;
-
+                                               
 #define HTTP_RANGE_PREFACE \
        HTTP_CRLF "--%s" \
        HTTP_CRLF "Content-Type: %s" \
        HTTP_CRLF "Content-Range: bytes %ld-%ld/%zu" \
        HTTP_CRLF HTTP_CRLF
 #define HTTP_RANGE_PREFACE \
        HTTP_CRLF "--%s" \
        HTTP_CRLF "Content-Type: %s" \
        HTTP_CRLF "Content-Range: bytes %ld-%ld/%zu" \
        HTTP_CRLF HTTP_CRLF
-                                               
-                                               preface_len = snprintf(preface_str, sizeof(preface_str), HTTP_RANGE_PREFACE, boundary_str, content_type, Z_LVAL_PP(begin), Z_LVAL_PP(end), data_size);
-                                               http_send_response_data_plain(&s, preface_str, preface_len);
+
+                                               phpstr_appendf(&preface, HTTP_RANGE_PREFACE, boundary_str, content_type, Z_LVAL_PP(begin), Z_LVAL_PP(end), data_size);
+                                               phpstr_fix(&preface);
+                                               http_send_response_data_plain(&s, PHPSTR_VAL(&preface), PHPSTR_LEN(&preface));
+                                               phpstr_reset(&preface);
                                                http_send_response_data_fetch(&s, data_ptr, data_size, data_mode, Z_LVAL_PP(begin), Z_LVAL_PP(end) + 1);
                                        }
                                }
                                                http_send_response_data_fetch(&s, data_ptr, data_size, data_mode, Z_LVAL_PP(begin), Z_LVAL_PP(end) + 1);
                                        }
                                }
+                               phpstr_dtor(&preface);
                                
                                http_send_response_data_plain(&s, HTTP_CRLF "--", lenof(HTTP_CRLF "--"));
                                http_send_response_data_plain(&s, boundary_str, boundary_len);
                                
                                http_send_response_data_plain(&s, HTTP_CRLF "--", lenof(HTTP_CRLF "--"));
                                http_send_response_data_plain(&s, boundary_str, boundary_len);