|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
Patch JSONFix.patch for JSON related Bug #64874Patch version 2013-09-10 21:23 UTC Return to Bug #64874 | Download this patchThis patch is obsolete Obsoleted by patches:
Developer: ajf@ajf.me
From 02bae13c471bde0b262394aae96c89d6e588fd0b Mon Sep 17 00:00:00 2001
From: Andrea Faulds <ajf@ajf.me>
Date: Tue, 10 Sep 2013 21:22:06 +0000
Subject: [PATCH] JSON: Fixed whitespace and case handling for top-level basic
types
---
ext/json/json.c | 31 +++++++++++++++++++++++--------
1 file changed, 23 insertions(+), 8 deletions(-)
diff --git a/ext/json/json.c b/ext/json/json.c
index 8c8963d..b0337d5 100644
--- a/ext/json/json.c
+++ b/ext/json/json.c
@@ -684,21 +684,36 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len,
double d;
int type, overflow_info;
long p;
+ char *trim = str;
+ int trim_len = str_len;
+
+ /* Increment trimmed string pointer to strip leading whitespace */
+ /* JSON RFC says to consider as whitespace: space, tab, LF or CR */
+ while (trim_len && (*trim == ' ' || *trim == '\t' || *trim == '\n' || *trim == '\r')) {
+ trim++;
+ trim_len--;
+ }
+
+ /* Decrement trimmed string length to strip trailing whitespace */
+ while (trim_len && (trim[trim_len - 1] == ' ' || trim[trim_len - 1] == '\t' || trim[trim_len - 1] == '\n' || trim[trim_len - 1] == '\r')) {
+ trim[trim_len - 1] = '\0';
+ trim_len--;
+ }
RETVAL_NULL();
- if (str_len == 4) {
- if (!strcasecmp(str, "null")) {
+ if (trim_len == 4) {
+ if (!strncmp(trim, "null", trim_len)) {
/* We need to explicitly clear the error because its an actual NULL and not an error */
jp->error_code = PHP_JSON_ERROR_NONE;
RETVAL_NULL();
- } else if (!strcasecmp(str, "true")) {
+ } else if (!strncmp(trim, "true", trim_len)) {
RETVAL_BOOL(1);
}
- } else if (str_len == 5 && !strcasecmp(str, "false")) {
+ } else if (trim_len == 5 && !strncmp(trim, "false", trim_len)) {
RETVAL_BOOL(0);
}
- if ((type = is_numeric_string_ex(str, str_len, &p, &d, 0, &overflow_info)) != 0) {
+ if ((type = is_numeric_string_ex(trim, trim_len, &p, &d, 0, &overflow_info)) != 0) {
if (type == IS_LONG) {
RETVAL_LONG(p);
} else if (type == IS_DOUBLE) {
@@ -711,10 +726,10 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len,
int i;
zend_bool is_float = 0;
- for (i = (str[0] == '-' ? 1 : 0); i < str_len; i++) {
+ for (i = (trim[0] == '-' ? 1 : 0); i < trim_len; i++) {
/* Not using isdigit() because it's locale specific,
* but we expect JSON input to always be UTF-8. */
- if (str[i] < '0' || str[i] > '9') {
+ if (trim[i] < '0' || trim[i] > '9') {
is_float = 1;
break;
}
@@ -723,7 +738,7 @@ PHP_JSON_API void php_json_decode_ex(zval *return_value, char *str, int str_len,
if (is_float) {
RETVAL_DOUBLE(d);
} else {
- RETVAL_STRINGL(str, str_len, 1);
+ RETVAL_STRINGL(trim, trim_len, 1);
}
} else {
RETVAL_DOUBLE(d);
--
1.7.10.4
|
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Dec 01 10:00:01 2025 UTC |