]> granicus.if.org Git - php/commitdiff
Allow the json_decode() depth to be any size, but keep the static one around for...
authorScott MacVicar <scottmac@php.net>
Thu, 14 May 2009 00:13:57 +0000 (00:13 +0000)
committerScott MacVicar <scottmac@php.net>
Thu, 14 May 2009 00:13:57 +0000 (00:13 +0000)
ext/json/JSON_parser.c
ext/json/JSON_parser.h
ext/json/json.c

index 9bc6d9d1aa245f8f0abe850e8ed86a5c9b4c4688..1b2e22b81ecceb1f298b9bc7c5de7594634adb7b 100644 (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;
 }
index a4bc9e50c38e011c106504eb793c75d84abfcdb6..03be9ce990bf8a1c0c97be525ee802f44d17f840 100644 (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 {
index a327838dccdbbc31f53b76682320f6acf2dbeb12..d9616ca7fd8a342dfea7c6b181dc1977e5cff32f 100644 (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);