diff options
author | Scott MacVicar <scottmac@php.net> | 2009-05-14 22:02:08 +0000 |
---|---|---|
committer | Scott MacVicar <scottmac@php.net> | 2009-05-14 22:02:08 +0000 |
commit | d2a7785878c37fc7b4eac25b5649cade5b745f01 (patch) | |
tree | 69dbd3c1f8ec8cb6f4fbff13301ca30aea0a2f16 /ext/json | |
parent | c0ce0e793289b4657380412c39314546b463956b (diff) | |
download | php-git-d2a7785878c37fc7b4eac25b5649cade5b745f01.tar.gz |
MFH Allow a custom recursion depth to be specified for json_decode()
Diffstat (limited to 'ext/json')
-rw-r--r-- | ext/json/JSON_parser.c | 8 | ||||
-rw-r--r-- | ext/json/JSON_parser.h | 6 | ||||
-rw-r--r-- | ext/json/json.c | 8 |
3 files changed, 15 insertions, 7 deletions
diff --git a/ext/json/JSON_parser.c b/ext/json/JSON_parser.c index 6aae849f16..6fbdb54814 100644 --- a/ext/json/JSON_parser.c +++ b/ext/json/JSON_parser.c @@ -247,6 +247,11 @@ new_JSON_parser(int depth) jp->top = -1; jp->error_code = PHP_JSON_ERROR_NONE; jp->stack = (int*)ecalloc(depth, sizeof(int)); + if (depth > JSON_PARSER_DEFAULT_DEPTH) { + jp->the_zstack = (zval **)safe_emalloc(depth, sizeof(zval), 0); + } else { + jp->the_zstack = &jp->the_static_zstack[0]; + } push(jp, MODE_DONE); return jp; } @@ -258,6 +263,9 @@ int free_JSON_parser(JSON_parser jp) { efree((void*)jp->stack); + if (jp->the_zstack != &jp->the_static_zstack[0]) { + efree(jp->the_zstack); + } efree((void*)jp); return false; } diff --git a/ext/json/JSON_parser.h b/ext/json/JSON_parser.h index 0ed7e52a8f..771ba967ac 100644 --- a/ext/json/JSON_parser.h +++ b/ext/json/JSON_parser.h @@ -6,7 +6,7 @@ #include "php.h" #include "ext/standard/php_smart_str.h" -#define JSON_PARSER_MAX_DEPTH 512 +#define JSON_PARSER_DEFAULT_DEPTH 512 typedef struct JSON_parser_struct { int state; @@ -14,8 +14,8 @@ typedef struct JSON_parser_struct { int top; int error_code; int* stack; - zval *the_zstack[JSON_PARSER_MAX_DEPTH]; - + zval **the_zstack; + zval *the_static_zstack[JSON_PARSER_DEFAULT_DEPTH]; } * JSON_parser; enum error_codes { diff --git a/ext/json/json.c b/ext/json/json.c index 42721edac6..a30d13ed36 100644 --- a/ext/json/json.c +++ b/ext/json/json.c @@ -494,7 +494,7 @@ static PHP_FUNCTION(json_decode) char *str; int str_len, utf16_len; zend_bool assoc = 0; /* return JS objects as PHP objects by default */ - long depth = JSON_PARSER_MAX_DEPTH; + long depth = JSON_PARSER_DEFAULT_DEPTH; zval *z; unsigned short *utf16; JSON_parser jp; @@ -517,9 +517,9 @@ static PHP_FUNCTION(json_decode) RETURN_NULL(); } - /* can be removed once we remove the max depth limit */ - if (depth <= 0 || depth > JSON_PARSER_MAX_DEPTH) { - depth = JSON_PARSER_MAX_DEPTH; + if (depth <= 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Depth must greater than zero."); + RETURN_NULL(); } ALLOC_INIT_ZVAL(z); |