X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=eebfeb2ef80840c9f2f53bb46b3782413941dcea;hp=8bbb34ac785fd6cd636b664628c15e99bf84ec4f;hb=ffc893b125c6cc9b385a68a357b08ba2cc4e91f6;hpb=7408a11c30c6d7cf0933ebbedabf9551db598bcd diff --git a/http_api.c b/http_api.c index 8bbb34a..eebfeb2 100644 --- a/http_api.c +++ b/http_api.c @@ -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 @@ -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: