Revision b011f619 json-lexer.c

b/json-lexer.c
105 105
        ['u'] = IN_DQ_UCODE0,
106 106
    },
107 107
    [IN_DQ_STRING] = {
108
        [1 ... 0xFF] = IN_DQ_STRING,
108
        [1 ... 0xBF] = IN_DQ_STRING,
109
        [0xC2 ... 0xF4] = IN_DQ_STRING,
109 110
        ['\\'] = IN_DQ_STRING_ESCAPE,
110 111
        ['"'] = JSON_STRING,
111 112
    },
......
144 145
        ['u'] = IN_SQ_UCODE0,
145 146
    },
146 147
    [IN_SQ_STRING] = {
147
        [1 ... 0xFF] = IN_SQ_STRING,
148
        [1 ... 0xBF] = IN_SQ_STRING,
149
        [0xC2 ... 0xF4] = IN_SQ_STRING,
148 150
        ['\\'] = IN_SQ_STRING_ESCAPE,
149 151
        ['\''] = JSON_STRING,
150 152
    },
......
305 307
            new_state = IN_START;
306 308
            break;
307 309
        case IN_ERROR:
310
            /* XXX: To avoid having previous bad input leaving the parser in an
311
             * unresponsive state where we consume unpredictable amounts of
312
             * subsequent "good" input, percolate this error state up to the
313
             * tokenizer/parser by forcing a NULL object to be emitted, then
314
             * reset state.
315
             *
316
             * Also note that this handling is required for reliable channel
317
             * negotiation between QMP and the guest agent, since chr(0xFF)
318
             * is placed at the beginning of certain events to ensure proper
319
             * delivery when the channel is in an unknown state. chr(0xFF) is
320
             * never a valid ASCII/UTF-8 sequence, so this should reliably
321
             * induce an error/flush state.
322
             */
323
            lexer->emit(lexer, lexer->token, JSON_ERROR, lexer->x, lexer->y);
308 324
            QDECREF(lexer->token);
309 325
            lexer->token = qstring_new();
310 326
            new_state = IN_START;
311
            return -EINVAL;
327
            lexer->state = new_state;
328
            return 0;
312 329
        default:
313 330
            break;
314 331
        }
......
346 363

  
347 364
int json_lexer_flush(JSONLexer *lexer)
348 365
{
349
    return lexer->state == IN_START ? 0 : json_lexer_feed_char(lexer, 0);
366
    return lexer->state == IN_START ? 0 : json_lexer_feed_char(lexer, 0, true);
350 367
}
351 368

  
352 369
void json_lexer_destroy(JSONLexer *lexer)

Also available in: Unified diff