Commit | Line | Data |
---|---|---|
f2b4c18c JL |
1 | Fix CVE-2015-8863 (Off-by-one error in the tokenadd function in |
2 | jv_parse.c in jq allows remote attackers to cause a denial of service | |
3 | (crash) via a long JSON-encoded number, which triggers a heap-based | |
4 | buffer overflow): | |
5 | ||
6 | <https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-8863> | |
7 | ||
8 | Copied from upstream code repository: | |
9 | ||
10 | <https://github.com/stedolan/jq/commit/8eb1367ca44e772963e704a700ef72ae2e12babd> | |
11 | ||
12 | From 8eb1367ca44e772963e704a700ef72ae2e12babd Mon Sep 17 00:00:00 2001 | |
13 | From: Nicolas Williams <nico@cryptonector.com> | |
14 | Date: Sat, 24 Oct 2015 17:24:57 -0500 | |
15 | Subject: [PATCH] Heap buffer overflow in tokenadd() (fix #105) | |
16 | ||
17 | This was an off-by one: the NUL terminator byte was not allocated on | |
18 | resize. This was triggered by JSON-encoded numbers longer than 256 | |
19 | bytes. | |
20 | --- | |
21 | jv_parse.c | 4 ++-- | |
22 | 1 file changed, 2 insertions(+), 2 deletions(-) | |
23 | ||
24 | diff --git a/jv_parse.c b/jv_parse.c | |
25 | index 3102ed4..84245b8 100644 | |
26 | --- a/jv_parse.c | |
27 | +++ b/jv_parse.c | |
28 | @@ -383,7 +383,7 @@ static pfunc stream_token(struct jv_parser* p, char ch) { | |
29 | ||
30 | static void tokenadd(struct jv_parser* p, char c) { | |
31 | assert(p->tokenpos <= p->tokenlen); | |
32 | - if (p->tokenpos == p->tokenlen) { | |
33 | + if (p->tokenpos >= (p->tokenlen - 1)) { | |
34 | p->tokenlen = p->tokenlen*2 + 256; | |
35 | p->tokenbuf = jv_mem_realloc(p->tokenbuf, p->tokenlen); | |
36 | } | |
37 | @@ -485,7 +485,7 @@ static pfunc check_literal(struct jv_parser* p) { | |
38 | TRY(value(p, v)); | |
39 | } else { | |
40 | // FIXME: better parser | |
41 | - p->tokenbuf[p->tokenpos] = 0; // FIXME: invalid | |
42 | + p->tokenbuf[p->tokenpos] = 0; | |
43 | char* end = 0; | |
44 | double d = jvp_strtod(&p->dtoa, p->tokenbuf, &end); | |
45 | if (end == 0 || *end != 0) |