bjori Tue Jul 24 22:54:26 2007 UTC
Added files:
/php-src/ext/json/tests bug42090.phpt
Modified files:
/php-src/ext/json json.c
Log:
Fixed bug#42090 (json_decode causes segmentation fault)
http://cvs.php.net/viewvc.cgi/php-src/ext/json/json.c?r1=1.27&r2=1.28&diff_format=u
Index: php-src/ext/json/json.c
diff -u php-src/ext/json/json.c:1.27 php-src/ext/json/json.c:1.28
--- php-src/ext/json/json.c:1.27 Wed Jun 13 17:10:06 2007
+++ php-src/ext/json/json.c Tue Jul 24 22:54:26 2007
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: json.c,v 1.27 2007/06/13 17:10:06 iliaa Exp $ */
+/* $Id: json.c,v 1.28 2007/07/24 22:54:26 bjori Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -485,7 +485,7 @@
RETURN_DOUBLE(d);
}
}
- if (*str.s == '"' || str.s[str_len] == '"') {
+ if (str_len > 1 && *str.s == '"' && str.s[str_len-1] == '"') {
RETURN_STRINGL(str.s+1, str_len-2, 1);
} else {
RETURN_STRINGL(str.s, str_len, 1);
@@ -514,7 +514,7 @@
RETURN_DOUBLE(d);
}
}
- if (*str.u == 0x22 /*'"'*/ || str.u[str_len] == 0x22 /*'"'*/) {
+ if (str_len > 1 && *str.u == 0x22 /*'"'*/ && str.u[str_len-1]
== 0x22 /*'"'*/) {
RETURN_UNICODEL(str.u+1, str_len-2, 1);
} else {
RETURN_UNICODEL(str.u, str_len, 1);
http://cvs.php.net/viewvc.cgi/php-src/ext/json/tests/bug42090.phpt?view=markup&rev=1.1
Index: php-src/ext/json/tests/bug42090.phpt
+++ php-src/ext/json/tests/bug42090.phpt
--TEST--
Bug#42090 (json_decode causes segmentation fault)
--SKIPIF--
<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
var_dump(
json_decode('""'),
json_decode('"..".'),
json_decode('"'),
json_decode('""""'),
json_encode('"'),
json_decode(json_encode('"')),
json_decode(json_encode('""'))
);
?>
--EXPECT--
string(0) ""
string(5) "".."."
string(1) """
string(2) """"
string(4) ""\"""
string(1) """
string(2) """"
--UEXPECT--
unicode(0) ""
unicode(5) "".."."
unicode(1) """
unicode(2) """"
string(4) ""\"""
unicode(1) """
unicode(2) """"
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php