X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=eebfeb2ef80840c9f2f53bb46b3782413941dcea;hp=abc2c9beeb155a925b1b4e8dcf52568bc8ba0d86;hb=dd18f054d481e2d24f766db8f36e8e721950d68c;hpb=bb1f32fd5d06b9b9ace6517c177b0fe58c9ff57c diff --git a/http_api.c b/http_api.c index abc2c9b..eebfeb2 100644 --- a/http_api.c +++ b/http_api.c @@ -295,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); @@ -358,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: