X-Git-Url: http://andersk.mit.edu/gitweb/libyaml.git/blobdiff_plain/54815ffd349279576102da76745f482b5ba5a236..0044e680dc24577d2b91cbbf287a2183461e9b80:/src/reader.c diff --git a/src/reader.c b/src/reader.c index ea189c2..d47921c 100644 --- a/src/reader.c +++ b/src/reader.c @@ -120,7 +120,7 @@ yaml_parser_update_raw_buffer(yaml_parser_t *parser) if (!parser->read_handler(parser->read_handler_data, parser->raw_buffer.last, parser->raw_buffer.end - parser->raw_buffer.last, &size_read)) { - return yaml_parser_set_reader_error(parser, "Input error", + return yaml_parser_set_reader_error(parser, "input error", parser->offset, -1); } parser->raw_buffer.last += size_read; @@ -141,6 +141,8 @@ yaml_parser_update_raw_buffer(yaml_parser_t *parser) YAML_DECLARE(int) yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) { + int first = 1; + assert(parser->read_handler); /* Read handler must be set. */ /* If the EOF flag is set and the raw buffer is empty, do nothing. */ @@ -178,9 +180,12 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) while (parser->unread < length) { - /* Fill the raw buffer. */ + /* Fill the raw buffer if necessary. */ - if (!yaml_parser_update_raw_buffer(parser)) return 0; + if (!first || parser->raw_buffer.pointer == parser->raw_buffer.last) { + if (!yaml_parser_update_raw_buffer(parser)) return 0; + } + first = 0; /* Decode the raw buffer. */ @@ -190,8 +195,9 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) int incomplete = 0; unsigned char octet; unsigned int width = 0; - int k, low, high; - int raw_unread = parser->raw_buffer.last - parser->raw_buffer.pointer; + int low, high; + size_t k; + size_t raw_unread = parser->raw_buffer.last - parser->raw_buffer.pointer; /* Decode the next character. */ @@ -231,7 +237,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) if (!width) return yaml_parser_set_reader_error(parser, - "Invalid leading UTF-8 octet", + "invalid leading UTF-8 octet", parser->offset, octet); /* Check if the raw buffer contains an incomplete character. */ @@ -239,7 +245,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) if (width > raw_unread) { if (parser->eof) { return yaml_parser_set_reader_error(parser, - "Incomplete UTF-8 octet sequence", + "incomplete UTF-8 octet sequence", parser->offset, -1); } incomplete = 1; @@ -263,7 +269,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) if ((octet & 0xC0) != 0x80) return yaml_parser_set_reader_error(parser, - "Invalid trailing UTF-8 octet", + "invalid trailing UTF-8 octet", parser->offset+k, octet); /* Decode the octet. */ @@ -278,14 +284,14 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) (width == 3 && value >= 0x800) || (width == 4 && value >= 0x10000))) return yaml_parser_set_reader_error(parser, - "Invalid length of a UTF-8 sequence", + "invalid length of a UTF-8 sequence", parser->offset, -1); /* Check the range of the value. */ if ((value >= 0xD800 && value <= 0xDFFF) || value > 0x10FFFF) return yaml_parser_set_reader_error(parser, - "Invalid Unicode character", + "invalid Unicode character", parser->offset, value); break; @@ -327,7 +333,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) if (raw_unread < 2) { if (parser->eof) { return yaml_parser_set_reader_error(parser, - "Incomplete UTF-16 character", + "incomplete UTF-16 character", parser->offset, -1); } incomplete = 1; @@ -343,7 +349,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) if ((value & 0xFC00) == 0xDC00) return yaml_parser_set_reader_error(parser, - "Unexpected low surrogate area", + "unexpected low surrogate area", parser->offset, value); /* Check for a high surrogate area. */ @@ -357,7 +363,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) if (raw_unread < 4) { if (parser->eof) { return yaml_parser_set_reader_error(parser, - "Incomplete UTF-16 surrogate pair", + "incomplete UTF-16 surrogate pair", parser->offset, -1); } incomplete = 1; @@ -373,7 +379,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) if ((value2 & 0xFC00) != 0xDC00) return yaml_parser_set_reader_error(parser, - "Expected low surrogate area", + "expected low surrogate area", parser->offset+2, value2); /* Generate the value of the surrogate pair. */ @@ -408,7 +414,7 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) || (value >= 0xE000 && value <= 0xFFFD) || (value >= 0x10000 && value <= 0x10FFFF))) return yaml_parser_set_reader_error(parser, - "Control characters are not allowed", + "control characters are not allowed", parser->offset, value); /* Move the raw pointers. */ @@ -454,6 +460,10 @@ yaml_parser_update_buffer(yaml_parser_t *parser, size_t length) } + if (parser->offset >= PTRDIFF_MAX) + return yaml_parser_set_reader_error(parser, "input is too long", + PTRDIFF_MAX, -1); + return 1; }