diff options
| author | Jakub Zelenka <bukka@php.net> | 2015-06-28 17:16:12 +0100 | 
|---|---|---|
| committer | Jakub Zelenka <bukka@php.net> | 2015-06-28 17:16:12 +0100 | 
| commit | 64c371142cbdb82eb0879d247430797d73a8ac2d (patch) | |
| tree | 280612b73745c40b0c838f2b8797eac712b72367 /ext/json/json_scanner.c | |
| parent | 695b4f4cad83c90f928af8a1c227defd5c6ca63c (diff) | |
| download | php-git-64c371142cbdb82eb0879d247430797d73a8ac2d.tar.gz | |
Fix bug #62010 (json_decode produces invalid byte-sequences)
Diffstat (limited to 'ext/json/json_scanner.c')
| -rw-r--r-- | ext/json/json_scanner.c | 415 | 
1 files changed, 217 insertions, 198 deletions
diff --git a/ext/json/json_scanner.c b/ext/json/json_scanner.c index a9d220cba2..7b192c43f1 100644 --- a/ext/json/json_scanner.c +++ b/ext/json/json_scanner.c @@ -593,7 +593,7 @@ yy81:  				goto yy71;  			}  		} else { -			goto yy101; +			goto yy103;  		}  yy82:  		yych = *++YYCURSOR; @@ -649,28 +649,28 @@ yy94:  		if (yych <= 'D') {  			if (yych <= '9') {  				if (yych <= '/') goto yy81; -				if (yych >= '1') goto yy97; +				if (yych >= '1') goto yy96;  			} else {  				if (yych <= '@') goto yy81; -				if (yych <= 'C') goto yy97; -				goto yy96; +				if (yych <= 'C') goto yy96; +				goto yy97;  			}  		} else {  			if (yych <= 'c') { -				if (yych <= 'F') goto yy97; +				if (yych <= 'F') goto yy96;  				if (yych <= '`') goto yy81; -				goto yy97; +				goto yy96;  			} else { -				if (yych <= 'd') goto yy96; -				if (yych <= 'f') goto yy97; +				if (yych <= 'd') goto yy97; +				if (yych <= 'f') goto yy96;  				goto yy81;  			}  		}  		yych = *++YYCURSOR;  		if (yych <= '9') {  			if (yych <= '/') goto yy81; -			if (yych <= '0') goto yy112; -			if (yych <= '7') goto yy113; +			if (yych <= '0') goto yy116; +			if (yych <= '7') goto yy117;  			goto yy98;  		} else {  			if (yych <= 'F') { @@ -684,173 +684,204 @@ yy94:  		}  yy96:  		yych = *++YYCURSOR; +		if (yych <= '@') { +			if (yych <= '/') goto yy81; +			if (yych <= '9') goto yy98; +			goto yy81; +		} else { +			if (yych <= 'F') goto yy98; +			if (yych <= '`') goto yy81; +			if (yych <= 'f') goto yy98; +			goto yy81; +		} +yy97: +		yych = *++YYCURSOR;  		if (yych <= 'B') {  			if (yych <= '7') {  				if (yych <= '/') goto yy81; -				goto yy98;  			} else { -				if (yych <= '9') goto yy102; +				if (yych <= '9') goto yy99;  				if (yych <= '@') goto yy81; -				goto yy102; +				goto yy99;  			}  		} else {  			if (yych <= '`') { -				if (yych <= 'F') goto yy98; +				if (yych <= 'F') goto yy100;  				goto yy81;  			} else { -				if (yych <= 'b') goto yy102; -				if (yych <= 'f') goto yy98; +				if (yych <= 'b') goto yy99; +				if (yych <= 'f') goto yy100;  				goto yy81;  			}  		} -yy97: +yy98:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81; -			if (yych >= ':') goto yy81; +			if (yych <= '9') goto yy113; +			goto yy81;  		} else { -			if (yych <= 'F') goto yy98; +			if (yych <= 'F') goto yy113;  			if (yych <= '`') goto yy81; -			if (yych >= 'g') goto yy81; +			if (yych <= 'f') goto yy113; +			goto yy81;  		} -yy98: +yy99:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81; -			if (yych >= ':') goto yy81; +			if (yych <= '9') goto yy104; +			goto yy81;  		} else { -			if (yych <= 'F') goto yy99; +			if (yych <= 'F') goto yy104;  			if (yych <= '`') goto yy81; -			if (yych >= 'g') goto yy81; +			if (yych <= 'f') goto yy104; +			goto yy81;  		} -yy99: +yy100:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81;  			if (yych >= ':') goto yy81;  		} else { -			if (yych <= 'F') goto yy100; +			if (yych <= 'F') goto yy101;  			if (yych <= '`') goto yy81;  			if (yych >= 'g') goto yy81;  		} -yy100: -		++YYCURSOR;  yy101: -		{ -		s->str_esc += 3; -		PHP_JSON_CONDITION_GOTO(STR_P1); -	} -yy102:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81;  			if (yych >= ':') goto yy81;  		} else { -			if (yych <= 'F') goto yy103; +			if (yych <= 'F') goto yy102;  			if (yych <= '`') goto yy81;  			if (yych >= 'g') goto yy81;  		} +yy102: +		++YYCURSOR;  yy103: +		{ +		s->errcode = PHP_JSON_ERROR_UTF16; +		return PHP_JSON_T_ERROR; +	} +yy104:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81;  			if (yych >= ':') goto yy81;  		} else { -			if (yych <= 'F') goto yy104; +			if (yych <= 'F') goto yy105;  			if (yych <= '`') goto yy81;  			if (yych >= 'g') goto yy81;  		} -yy104: +yy105:  		yyaccept = 2;  		yych = *(YYMARKER = ++YYCURSOR); -		if (yych != '\\') goto yy101; +		if (yych != '\\') goto yy103;  		yych = *++YYCURSOR;  		if (yych != 'u') goto yy81;  		yych = *++YYCURSOR; -		if (yych == 'D') goto yy107; +		if (yych == 'D') goto yy108;  		if (yych != 'd') goto yy81; -yy107: +yy108:  		yych = *++YYCURSOR;  		if (yych <= 'B') goto yy81; -		if (yych <= 'F') goto yy108; +		if (yych <= 'F') goto yy109;  		if (yych <= 'b') goto yy81;  		if (yych >= 'g') goto yy81; -yy108: +yy109:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81;  			if (yych >= ':') goto yy81;  		} else { -			if (yych <= 'F') goto yy109; +			if (yych <= 'F') goto yy110;  			if (yych <= '`') goto yy81;  			if (yych >= 'g') goto yy81;  		} -yy109: +yy110:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81;  			if (yych >= ':') goto yy81;  		} else { -			if (yych <= 'F') goto yy110; +			if (yych <= 'F') goto yy111;  			if (yych <= '`') goto yy81;  			if (yych >= 'g') goto yy81;  		} -yy110: +yy111:  		++YYCURSOR;  		{  		s->str_esc += 8;  		PHP_JSON_CONDITION_GOTO(STR_P1);  	} -yy112: +yy113:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81; -			if (yych <= '7') goto yy117; -			if (yych <= '9') goto yy114; -			goto yy81; +			if (yych >= ':') goto yy81;  		} else {  			if (yych <= 'F') goto yy114;  			if (yych <= '`') goto yy81; -			if (yych <= 'f') goto yy114; +			if (yych >= 'g') goto yy81; +		} +yy114: +		++YYCURSOR; +		{ +		s->str_esc += 3; +		PHP_JSON_CONDITION_GOTO(STR_P1); +	} +yy116: +		yych = *++YYCURSOR; +		if (yych <= '@') { +			if (yych <= '/') goto yy81; +			if (yych <= '7') goto yy121; +			if (yych <= '9') goto yy118; +			goto yy81; +		} else { +			if (yych <= 'F') goto yy118; +			if (yych <= '`') goto yy81; +			if (yych <= 'f') goto yy118;  			goto yy81;  		} -yy113: +yy117:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81;  			if (yych >= ':') goto yy81;  		} else { -			if (yych <= 'F') goto yy114; +			if (yych <= 'F') goto yy118;  			if (yych <= '`') goto yy81;  			if (yych >= 'g') goto yy81;  		} -yy114: +yy118:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81;  			if (yych >= ':') goto yy81;  		} else { -			if (yych <= 'F') goto yy115; +			if (yych <= 'F') goto yy119;  			if (yych <= '`') goto yy81;  			if (yych >= 'g') goto yy81;  		} -yy115: +yy119:  		++YYCURSOR;  		{  		s->str_esc += 4;  		PHP_JSON_CONDITION_GOTO(STR_P1);  	} -yy117: +yy121:  		yych = *++YYCURSOR;  		if (yych <= '@') {  			if (yych <= '/') goto yy81;  			if (yych >= ':') goto yy81;  		} else { -			if (yych <= 'F') goto yy118; +			if (yych <= 'F') goto yy122;  			if (yych <= '`') goto yy81;  			if (yych >= 'g') goto yy81;  		} -yy118: +yy122:  		++YYCURSOR;  		{  		s->str_esc += 5; @@ -859,22 +890,22 @@ yy118:  /* *********************************** */  yyc_STR_P2:  		yych = *YYCURSOR; -		if (yych == '"') goto yy124; -		if (yych == '\\') goto yy126; +		if (yych == '"') goto yy128; +		if (yych == '\\') goto yy130;  		++YYCURSOR;  		{ PHP_JSON_CONDITION_GOTO(STR_P2); } -yy124: +yy128:  		++YYCURSOR;  		YYSETCONDITION(yycJS);  		{  		PHP_JSON_SCANNER_COPY_ESC();  		return PHP_JSON_T_STRING;  	} -yy126: +yy130:  		yyaccept = 0;  		yych = *(YYMARKER = ++YYCURSOR); -		if (yych == 'u') goto yy128; -yy127: +		if (yych == 'u') goto yy132; +yy131:  		{  		char esc;  		PHP_JSON_SCANNER_COPY_ESC(); @@ -908,105 +939,104 @@ yy127:  		s->str_start = s->cursor;  		PHP_JSON_CONDITION_GOTO(STR_P2);  	} -yy128: +yy132:  		yych = *++YYCURSOR;  		if (yych <= 'D') {  			if (yych <= '9') { -				if (yych <= '/') goto yy129; -				if (yych <= '0') goto yy130; -				goto yy132; +				if (yych <= '/') goto yy133; +				if (yych <= '0') goto yy134; +				goto yy135;  			} else { -				if (yych <= '@') goto yy129; -				if (yych <= 'C') goto yy132; -				goto yy131; +				if (yych <= '@') goto yy133; +				if (yych <= 'C') goto yy135; +				goto yy136;  			}  		} else {  			if (yych <= 'c') { -				if (yych <= 'F') goto yy132; -				if (yych >= 'a') goto yy132; +				if (yych <= 'F') goto yy135; +				if (yych >= 'a') goto yy135;  			} else { -				if (yych <= 'd') goto yy131; -				if (yych <= 'f') goto yy132; +				if (yych <= 'd') goto yy136; +				if (yych <= 'f') goto yy135;  			}  		} -yy129: +yy133:  		YYCURSOR = YYMARKER; -		if (yyaccept == 0) { -			goto yy127; -		} else { -			goto yy136; -		} -yy130: +		goto yy131; +yy134:  		yych = *++YYCURSOR;  		if (yych <= '9') { -			if (yych <= '/') goto yy129; -			if (yych <= '0') goto yy147; -			if (yych <= '7') goto yy148; -			goto yy133; +			if (yych <= '/') goto yy133; +			if (yych <= '0') goto yy151; +			if (yych <= '7') goto yy152; +			goto yy138;  		} else {  			if (yych <= 'F') { -				if (yych <= '@') goto yy129; -				goto yy133; +				if (yych <= '@') goto yy133; +				goto yy138;  			} else { -				if (yych <= '`') goto yy129; -				if (yych <= 'f') goto yy133; -				goto yy129; +				if (yych <= '`') goto yy133; +				if (yych <= 'f') goto yy138; +				goto yy133;  			}  		} -yy131: +yy135:  		yych = *++YYCURSOR; -		if (yych <= 'B') { -			if (yych <= '7') { -				if (yych <= '/') goto yy129; -				goto yy133; -			} else { -				if (yych <= '9') goto yy137; -				if (yych <= '@') goto yy129; -				goto yy137; -			} +		if (yych <= '@') { +			if (yych <= '/') goto yy133; +			if (yych <= '9') goto yy138; +			goto yy133;  		} else { -			if (yych <= '`') { -				if (yych <= 'F') goto yy133; -				goto yy129; -			} else { -				if (yych <= 'b') goto yy137; -				if (yych <= 'f') goto yy133; -				goto yy129; -			} +			if (yych <= 'F') goto yy138; +			if (yych <= '`') goto yy133; +			if (yych <= 'f') goto yy138; +			goto yy133;  		} -yy132: +yy136:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; +			if (yych <= '/') goto yy133; +			if (yych <= '7') goto yy138; +			if (yych >= ':') goto yy133;  		} else { -			if (yych <= 'F') goto yy133; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; +			if (yych <= 'B') goto yy137; +			if (yych <= '`') goto yy133; +			if (yych >= 'c') goto yy133;  		} -yy133: +yy137:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; +			if (yych <= '/') goto yy133; +			if (yych <= '9') goto yy142; +			goto yy133;  		} else { -			if (yych <= 'F') goto yy134; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; +			if (yych <= 'F') goto yy142; +			if (yych <= '`') goto yy133; +			if (yych <= 'f') goto yy142; +			goto yy133;  		} -yy134: +yy138: +		yych = *++YYCURSOR; +		if (yych <= '@') { +			if (yych <= '/') goto yy133; +			if (yych >= ':') goto yy133; +		} else { +			if (yych <= 'F') goto yy139; +			if (yych <= '`') goto yy133; +			if (yych >= 'g') goto yy133; +		} +yy139:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; +			if (yych <= '/') goto yy133; +			if (yych >= ':') goto yy133;  		} else { -			if (yych <= 'F') goto yy135; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; +			if (yych <= 'F') goto yy140; +			if (yych <= '`') goto yy133; +			if (yych >= 'g') goto yy133;  		} -yy135: +yy140:  		++YYCURSOR; -yy136:  		{  		int utf16 = php_json_ucs2_to_int(s, 4);  		PHP_JSON_SCANNER_COPY_UTF(); @@ -1016,62 +1046,51 @@ yy136:  		s->str_start = s->cursor;  		PHP_JSON_CONDITION_GOTO(STR_P2);  	} -yy137: +yy142:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; +			if (yych <= '/') goto yy133; +			if (yych >= ':') goto yy133;  		} else { -			if (yych <= 'F') goto yy138; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; +			if (yych <= 'F') goto yy143; +			if (yych <= '`') goto yy133; +			if (yych >= 'g') goto yy133;  		} -yy138: +yy143:  		yych = *++YYCURSOR; -		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; -		} else { -			if (yych <= 'F') goto yy139; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; -		} -yy139: -		yyaccept = 1; -		yych = *(YYMARKER = ++YYCURSOR); -		if (yych != '\\') goto yy136; +		if (yych != '\\') goto yy133;  		yych = *++YYCURSOR; -		if (yych != 'u') goto yy129; +		if (yych != 'u') goto yy133;  		yych = *++YYCURSOR; -		if (yych == 'D') goto yy142; -		if (yych != 'd') goto yy129; -yy142: +		if (yych == 'D') goto yy146; +		if (yych != 'd') goto yy133; +yy146:  		yych = *++YYCURSOR; -		if (yych <= 'B') goto yy129; -		if (yych <= 'F') goto yy143; -		if (yych <= 'b') goto yy129; -		if (yych >= 'g') goto yy129; -yy143: +		if (yych <= 'B') goto yy133; +		if (yych <= 'F') goto yy147; +		if (yych <= 'b') goto yy133; +		if (yych >= 'g') goto yy133; +yy147:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; +			if (yych <= '/') goto yy133; +			if (yych >= ':') goto yy133;  		} else { -			if (yych <= 'F') goto yy144; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; +			if (yych <= 'F') goto yy148; +			if (yych <= '`') goto yy133; +			if (yych >= 'g') goto yy133;  		} -yy144: +yy148:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; +			if (yych <= '/') goto yy133; +			if (yych >= ':') goto yy133;  		} else { -			if (yych <= 'F') goto yy145; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; +			if (yych <= 'F') goto yy149; +			if (yych <= '`') goto yy133; +			if (yych >= 'g') goto yy133;  		} -yy145: +yy149:  		++YYCURSOR;  		{  		int utf32, utf16_hi, utf16_lo; @@ -1086,40 +1105,40 @@ yy145:  		s->str_start = s->cursor;  		PHP_JSON_CONDITION_GOTO(STR_P2);  	} -yy147: +yy151:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych <= '7') goto yy152; -			if (yych <= '9') goto yy149; -			goto yy129; +			if (yych <= '/') goto yy133; +			if (yych <= '7') goto yy156; +			if (yych <= '9') goto yy153; +			goto yy133;  		} else { -			if (yych <= 'F') goto yy149; -			if (yych <= '`') goto yy129; -			if (yych <= 'f') goto yy149; -			goto yy129; +			if (yych <= 'F') goto yy153; +			if (yych <= '`') goto yy133; +			if (yych <= 'f') goto yy153; +			goto yy133;  		} -yy148: +yy152:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; +			if (yych <= '/') goto yy133; +			if (yych >= ':') goto yy133;  		} else { -			if (yych <= 'F') goto yy149; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; +			if (yych <= 'F') goto yy153; +			if (yych <= '`') goto yy133; +			if (yych >= 'g') goto yy133;  		} -yy149: +yy153:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; +			if (yych <= '/') goto yy133; +			if (yych >= ':') goto yy133;  		} else { -			if (yych <= 'F') goto yy150; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; +			if (yych <= 'F') goto yy154; +			if (yych <= '`') goto yy133; +			if (yych >= 'g') goto yy133;  		} -yy150: +yy154:  		++YYCURSOR;  		{  		int utf16 = php_json_ucs2_to_int(s, 3); @@ -1129,17 +1148,17 @@ yy150:  		s->str_start = s->cursor;  		PHP_JSON_CONDITION_GOTO(STR_P2);  	} -yy152: +yy156:  		yych = *++YYCURSOR;  		if (yych <= '@') { -			if (yych <= '/') goto yy129; -			if (yych >= ':') goto yy129; +			if (yych <= '/') goto yy133; +			if (yych >= ':') goto yy133;  		} else { -			if (yych <= 'F') goto yy153; -			if (yych <= '`') goto yy129; -			if (yych >= 'g') goto yy129; +			if (yych <= 'F') goto yy157; +			if (yych <= '`') goto yy133; +			if (yych >= 'g') goto yy133;  		} -yy153: +yy157:  		++YYCURSOR;  		{  		int utf16 = php_json_ucs2_to_int(s, 2);  | 
