]> granicus.if.org Git - php/commitdiff
There is no error code set for json_last_error if an invalid utf8
authorRasmus Lerdorf <rasmus@php.net>
Wed, 22 Jul 2009 21:32:58 +0000 (21:32 +0000)
committerRasmus Lerdorf <rasmus@php.net>
Wed, 22 Jul 2009 21:32:58 +0000 (21:32 +0000)
sequence is encountered.  This fixes that.  Might be worthwhile to
merge to 5.3 despite the new constant.

ext/json/JSON_parser.h
ext/json/json.c

index 03be9ce990bf8a1c0c97be525ee802f44d17f840..d4df5406a97afcb94dc6d18527569e6e1cc6f85d 100644 (file)
@@ -24,6 +24,7 @@ enum error_codes {
     PHP_JSON_ERROR_STATE_MISMATCH,  
     PHP_JSON_ERROR_CTRL_CHAR,   
     PHP_JSON_ERROR_SYNTAX,
+    PHP_JSON_ERROR_UTF8,
 };
 
 extern JSON_parser new_JSON_parser(int depth);
index b8d30e75b3b698b7e4cc4a8a34040fda7903aa75..2ebb76a51c720ef49dba387b2887576bb34a48a4 100644 (file)
@@ -93,6 +93,7 @@ static PHP_MINIT_FUNCTION(json)
        REGISTER_LONG_CONSTANT("JSON_ERROR_STATE_MISMATCH", PHP_JSON_ERROR_STATE_MISMATCH, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("JSON_ERROR_CTRL_CHAR", PHP_JSON_ERROR_CTRL_CHAR, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("JSON_ERROR_SYNTAX", PHP_JSON_ERROR_SYNTAX, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("JSON_ERROR_UTF8", PHP_JSON_ERROR_UTF8, CONST_CS | CONST_PERSISTENT);
 
        return SUCCESS;
 }
@@ -311,6 +312,7 @@ static void json_escape_string(smart_str *buf, zstr s, int len, zend_uchar type,
                                efree(utf16);
                        }
                        if (len < 0) {
+                               JSON_G(error_code) = PHP_JSON_ERROR_UTF8;
                                if (!PG(display_errors)) {
                                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid UTF-8 sequence in argument");
                                }
@@ -538,6 +540,7 @@ static PHP_FUNCTION(json_decode)
                        if (utf16) {
                                efree(utf16);
                        }
+                       JSON_G(error_code) = PHP_JSON_ERROR_UTF8;
                        RETURN_NULL();
                }
        }