Allow the json_decode() depth to be any size, but keep the static one around for now. It might make sense to allow an unbound depth.

This commit is contained in:
Scott MacVicar 2009-05-14 00:13:57 +00:00
parent 5af0cbef65
commit 1c1ba8cc06
3 changed files with 14 additions and 7 deletions

View file

@ -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;
}

View file

@ -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 {

View file

@ -507,7 +507,7 @@ static PHP_FUNCTION(json_decode)
int str_len, utf16_len;
zend_uchar str_type;
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;
@ -535,9 +535,8 @@ static PHP_FUNCTION(json_decode)
}
}
/* 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) {
depth = JSON_PARSER_DEFAULT_DEPTH;
}
ALLOC_INIT_ZVAL(z);