- add package.xml generated by $pecl pickle
[m6w6/ext-http] / http_api.c
index cbc5a60d7d9adefdc21eb592c4bc0ff6e0f0eb72..eebfeb2ef80840c9f2f53bb46b3782413941dcea 100644 (file)
@@ -85,7 +85,7 @@ STATUS _http_parse_key_list(const char *list, HashTable *items, char separator,
        int vallen = 0, keylen = 0, done = 0;
        zval array;
 
-       Z_ARRVAL(array) = items;
+       INIT_ZARR(array, items);
 
        if (!(val = strchr(list, '='))) {
                return FAILURE;
@@ -164,10 +164,9 @@ STATUS _http_parse_key_list(const char *list, HashTable *items, char separator,
 /* }}} */
 
 /* {{{ void http_error(long, long, char*) */
-void _http_error_ex(long type, long code, const char *format, ...)
+void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...)
 {
        va_list args;
-       TSRMLS_FETCH();
        
        va_start(args, format);
 #ifdef ZEND_ENGINE_2
@@ -198,7 +197,7 @@ void _http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC)
                php_stream *log = php_stream_open_wrapper(file, "ab", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); \
                 \
                if (log) { \
-                       php_stream_printf(log TSRMLS_CC, "%s [%12s] %32s <%s>%s", datetime, type, msg, SG(request_info).request_uri, PHP_EOL); \
+                       php_stream_printf(log TSRMLS_CC, "%s\t[%s]\t%s\t<%s>%s", datetime, type, msg, SG(request_info).request_uri, PHP_EOL); \
                        php_stream_close(log); \
                } \
         \
@@ -296,24 +295,28 @@ PHP_HTTP_API const char *_http_chunked_decode(const char *encoded, size_t encode
 {
        const char *e_ptr;
        char *d_ptr;
+       long rest;
        
        *decoded_len = 0;
        *decoded = ecalloc(1, encoded_len);
        d_ptr = *decoded;
        e_ptr = encoded;
 
-       while (((e_ptr - encoded) - encoded_len) > 0) {
-               size_t chunk_len = 0, EOL_len = 0;
-               int eol_mismatch = 0;
+       while ((rest = encoded + encoded_len - e_ptr) > 0) {
+               long chunk_len = 0;
+               int EOL_len = 0, eol_mismatch = 0;
                char *n_ptr;
 
                chunk_len = strtol(e_ptr, &n_ptr, 16);
 
                /* check if:
                 * - we could not read in chunk size
+                * - we got a negative chunk size
+                * - chunk size is greater then remaining size
                 * - chunk size is not followed by (CR)LF|NUL
                 */
-               if ((n_ptr == e_ptr) || (*n_ptr && (eol_mismatch = n_ptr != http_locate_eol(e_ptr, &EOL_len)))) {
+               if (    (n_ptr == e_ptr) ||     (chunk_len < 0) || (chunk_len > rest) || 
+                               (*n_ptr && (eol_mismatch = (n_ptr != http_locate_eol(e_ptr, &EOL_len))))) {
                        /* don't fail on apperently not encoded data */
                        if (e_ptr == encoded) {
                                memcpy(*decoded, encoded, encoded_len);
@@ -359,15 +362,19 @@ PHP_HTTP_API char *_http_guess_content_type(const char *magicfile, long magicmod
        char *ct = NULL;
 
 #ifdef HTTP_HAVE_MAGIC
-       struct magic_set *magic = magic_open(magicmode);
+       /*      magic_load() fails if MAGIC_MIME is set because it 
+               cowardly adds .mime to the file name */
+       struct magic_set *magic = magic_open(magicmode &~ MAGIC_MIME);
        
        if (!magic) {
                http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Invalid magic mode: %ld", magicmode);
        } else if (-1 == magic_load(magic, magicfile)) {
-               http_error_ex(HE_WARNING, HTTP_E_RUNTIME, "Failed to load magic database '%s'", magicfile);
+               http_error_ex(HE_WARNING, HTTP_E_RUNTIME, "Failed to load magic database '%s' (%s)", magicfile, magic_error(magic));
        } else {
                const char *ctype = NULL;
                
+               magic_setflags(magic, magicmode);
+               
                switch (data_mode)
                {
                        case SEND_RSRC: