projects
/
m6w6
/
ext-http
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
|
github
raw
|
inline
| side by side
- add package.xml generated by $pecl pickle
[m6w6/ext-http]
/
http_api.c
diff --git
a/http_api.c
b/http_api.c
index e2019ad47a4a4de301b7bc0f0a902ab9e4e7b3b9..eebfeb2ef80840c9f2f53bb46b3782413941dcea 100644
(file)
--- a/
http_api.c
+++ b/
http_api.c
@@
-37,6
+37,9
@@
#include <ctype.h>
#ifdef HTTP_HAVE_MAGIC
#include <ctype.h>
#ifdef HTTP_HAVE_MAGIC
+# if defined(PHP_WIN32) && !defined(USE_MAGIC_DLL) && !defined(USE_MAGIC_STATIC)
+# define USE_MAGIC_STATIC
+# endif
# include <magic.h>
#endif
# include <magic.h>
#endif
@@
-82,7
+85,7
@@
STATUS _http_parse_key_list(const char *list, HashTable *items, char separator,
int vallen = 0, keylen = 0, done = 0;
zval array;
int vallen = 0, keylen = 0, done = 0;
zval array;
-
Z_ARRVAL(array) = items
;
+
INIT_ZARR(array, items)
;
if (!(val = strchr(list, '='))) {
return FAILURE;
if (!(val = strchr(list, '='))) {
return FAILURE;
@@
-161,24
+164,20
@@
STATUS _http_parse_key_list(const char *list, HashTable *items, char separator,
/* }}} */
/* {{{ void http_error(long, long, char*) */
/* }}} */
/* {{{ 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;
{
va_list args;
- TSRMLS_FETCH();
-
+
va_start(args, format);
va_start(args, format);
- if (type == E_THROW) {
#ifdef ZEND_ENGINE_2
#ifdef ZEND_ENGINE_2
+ if ((type == E_THROW) || (PG(error_handling) == EH_THROW)) {
char *message;
char *message;
+
vspprintf(&message, 0, format, args);
zend_throw_exception(http_exception_get_for_code(code), message, code TSRMLS_CC);
vspprintf(&message, 0, format, args);
zend_throw_exception(http_exception_get_for_code(code), message, code TSRMLS_CC);
-#else
- type = E_WARNING;
+ } else
#endif
#endif
- }
- if (type != E_THROW) {
- php_verror(NULL, "", type, format, args TSRMLS_CC);
- }
+ php_verror(NULL, "", type, format, args TSRMLS_CC);
va_end(args);
}
/* }}} */
va_end(args);
}
/* }}} */
@@
-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 *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); \
} \
\
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;
{
const char *e_ptr;
char *d_ptr;
+ long rest;
*decoded_len = 0;
*decoded = ecalloc(1, encoded_len);
d_ptr = *decoded;
e_ptr = encoded;
*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
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
*/
* - 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);
/* 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
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)) {
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;
} else {
const char *ctype = NULL;
+ magic_setflags(magic, magicmode);
+
switch (data_mode)
{
case SEND_RSRC:
switch (data_mode)
{
case SEND_RSRC:
@@
-393,13
+400,12
@@
PHP_HTTP_API char *_http_guess_content_type(const char *magicfile, long magicmod
if (ctype) {
ct = estrdup(ctype);
} else {
if (ctype) {
ct = estrdup(ctype);
} else {
- http_error(HE_WARNING, HTTP_E_RUNTIME, "Failed to guess Content-Type");
- }
-
- if (magic) {
- magic_close(magic);
+ http_error_ex(HE_WARNING, HTTP_E_RUNTIME, "Failed to guess Content-Type: %s", magic_error(magic));
}
}
}
}
+ if (magic) {
+ magic_close(magic);
+ }
#else
http_error(HE_WARNING, HTTP_E_RUNTIME, "Cannot guess Content-Type; libmagic not available");
#endif
#else
http_error(HE_WARNING, HTTP_E_RUNTIME, "Cannot guess Content-Type; libmagic not available");
#endif