summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKirill Simonov <xi@resolvent.net>2014-03-26 07:03:17 -0500
committerKirill Simonov <xi@resolvent.net>2014-03-26 07:03:17 -0500
commitd1003a9d40b674520934f4f38ffc4ff2a809bc2d (patch)
tree70dbf2902eb1adb7dc89fa543728125a3b82ab3e /src
parent662f4be270c519ae74b46404ed30cd5ed47735bc (diff)
downloadlibyaml-git-d1003a9d40b674520934f4f38ffc4ff2a809bc2d.tar.gz
Fixed heap overflow in yaml_parser_scan_uri_escapes (Thanks Ivan Fratric of the Google Security Team).0.1.6
Diffstat (limited to 'src')
-rw-r--r--src/scanner.c3
-rw-r--r--src/yaml_private.h7
2 files changed, 8 insertions, 2 deletions
diff --git a/src/scanner.c b/src/scanner.c
index 8817de2..88d4fa5 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -2629,6 +2629,9 @@ yaml_parser_scan_tag_uri(yaml_parser_t *parser, int directive,
/* Check if it is a URI-escape sequence. */
if (CHECK(parser->buffer, '%')) {
+ if (!STRING_EXTEND(parser, string))
+ goto error;
+
if (!yaml_parser_scan_uri_escapes(parser,
directive, start_mark, &string)) goto error;
}
diff --git a/src/yaml_private.h b/src/yaml_private.h
index 9589e05..f0e1001 100644
--- a/src/yaml_private.h
+++ b/src/yaml_private.h
@@ -143,9 +143,12 @@ yaml_string_join(
(string).start = (string).pointer = (string).end = 0)
#define STRING_EXTEND(context,string) \
- (((string).pointer+5 < (string).end) \
+ ((((string).pointer+5 < (string).end) \
|| yaml_string_extend(&(string).start, \
- &(string).pointer, &(string).end))
+ &(string).pointer, &(string).end)) ? \
+ 1 : \
+ ((context)->error = YAML_MEMORY_ERROR, \
+ 0))
#define CLEAR(context,string) \
((string).pointer = (string).start, \