@@ -598,7 +598,7 @@ json_lex(JsonLexContext *lex)
598598 * the whole word as an unexpected token, rather than just
599599 * some unintuitive prefix thereof.
600600 */
601- for (p = s ;JSON_ALPHANUMERIC_CHAR ( * p ) && p - s < lex -> input_length - len ;p ++ )
601+ for (p = s ;p - s < lex -> input_length - len && JSON_ALPHANUMERIC_CHAR ( * p ) ;p ++ )
602602/* skip */ ;
603603
604604/*
@@ -651,16 +651,21 @@ json_lex_string(JsonLexContext *lex)
651651if (lex -> strval != NULL )
652652resetStringInfo (lex -> strval );
653653
654+ Assert (lex -> input_length > 0 );
655+ s = lex -> token_start ;
654656len = lex -> token_start - lex -> input ;
655- len ++ ;
656- for (s = lex -> token_start + 1 ;* s != '"' ;s ++ ,len ++ )
657+ for (;;)
657658{
659+ s ++ ;
660+ len ++ ;
658661/* Premature end of the string. */
659662if (len >=lex -> input_length )
660663{
661664lex -> token_terminator = s ;
662665report_invalid_token (lex );
663666}
667+ else if (* s == '"' )
668+ break ;
664669else if ((unsignedchar )* s < 32 )
665670{
666671/* Per RFC4627, these characters MUST be escaped. */
@@ -921,7 +926,7 @@ json_lex_number(JsonLexContext *lex, char *s)
921926{
922927s ++ ;
923928len ++ ;
924- }while (* s >='0' && * s <='9' && len < lex -> input_length );
929+ }while (len < lex -> input_length && * s >='0' && * s <='9' );
925930}
926931else
927932error = true;
@@ -939,7 +944,7 @@ json_lex_number(JsonLexContext *lex, char *s)
939944{
940945s ++ ;
941946len ++ ;
942- }while (* s >='0' && * s <='9' && len < lex -> input_length );
947+ }while (len < lex -> input_length && * s >='0' && * s <='9' );
943948}
944949}
945950
@@ -970,7 +975,7 @@ json_lex_number(JsonLexContext *lex, char *s)
970975 * here should be considered part of the token for error-reporting
971976 * purposes.
972977 */
973- for (p = s ;JSON_ALPHANUMERIC_CHAR ( * p ) && len < lex -> input_length ;p ++ ,len ++ )
978+ for (p = s ;len < lex -> input_length && JSON_ALPHANUMERIC_CHAR ( * p ) ;p ++ ,len ++ )
974979error = true;
975980lex -> prev_token_terminator = lex -> token_terminator ;
976981lex -> token_terminator = p ;
@@ -1138,8 +1143,8 @@ report_json_context(JsonLexContext *lex)
11381143line_number = 1 ;
11391144for (;;)
11401145{
1141- /* Always advance over newlines(context_end test is just paranoia) */
1142- if (* context_start == '\n' && context_start < context_end )
1146+ /* Always advance over newlines */
1147+ if (context_start < context_end && * context_start == '\n' )
11431148{
11441149context_start ++ ;
11451150line_start = context_start ;