]> git.ipfire.org Git - ipfire-2.x.git/blob - src/patches/dnsmasq/dnsmasq-2.73-fix-crash-in-DNSSEC-code-when-attempting-to-verify-large-RRs.patch
Merge remote-tracking branch 'glotzi/monit' into next
[ipfire-2.x.git] / src / patches / dnsmasq / dnsmasq-2.73-fix-crash-in-DNSSEC-code-when-attempting-to-verify-large-RRs.patch
1 From 094b5c3d904bae9aeb3206d9f3b8348926b84975 Mon Sep 17 00:00:00 2001
2 From: Simon Kelley <simon@thekelleys.org.uk>
3 Date: Sun, 21 Dec 2014 16:11:52 +0000
4 Subject: [PATCH] Fix crash in DNSSEC code when attempting to verify large
5 RRs.
6
7 ---
8 src/dnssec.c | 27 +++++++++++++++++++--------
9 1 files changed, 22 insertions(+), 8 deletions(-)
10
11 diff --git a/src/dnssec.c b/src/dnssec.c
12 index 69bfc29..3208ac7 100644
13 --- a/src/dnssec.c
14 +++ b/src/dnssec.c
15 @@ -456,16 +456,27 @@ static u16 *get_desc(int type)
16
17 /* Return bytes of canonicalised rdata, when the return value is zero, the remaining
18 data, pointed to by *p, should be used raw. */
19 -static int get_rdata(struct dns_header *header, size_t plen, unsigned char *end, char *buff,
20 +static int get_rdata(struct dns_header *header, size_t plen, unsigned char *end, char *buff, int bufflen,
21 unsigned char **p, u16 **desc)
22 {
23 int d = **desc;
24
25 - (*desc)++;
26 -
27 /* No more data needs mangling */
28 if (d == (u16)-1)
29 - return 0;
30 + {
31 + /* If there's more data than we have space for, just return what fits,
32 + we'll get called again for more chunks */
33 + if (end - *p > bufflen)
34 + {
35 + memcpy(buff, *p, bufflen);
36 + *p += bufflen;
37 + return bufflen;
38 + }
39 +
40 + return 0;
41 + }
42 +
43 + (*desc)++;
44
45 if (d == 0 && extract_name(header, plen, p, buff, 1, 0))
46 /* domain-name, canonicalise */
47 @@ -560,7 +571,7 @@ static void sort_rrset(struct dns_header *header, size_t plen, u16 *rr_desc, int
48 if (left1 != 0)
49 memmove(buff1, buff1 + len1 - left1, left1);
50
51 - if ((len1 = get_rdata(header, plen, end1, buff1 + left1, &p1, &dp1)) == 0)
52 + if ((len1 = get_rdata(header, plen, end1, buff1 + left1, MAXDNAME - left1, &p1, &dp1)) == 0)
53 {
54 quit = 1;
55 len1 = end1 - p1;
56 @@ -571,7 +582,7 @@ static void sort_rrset(struct dns_header *header, size_t plen, u16 *rr_desc, int
57 if (left2 != 0)
58 memmove(buff2, buff2 + len2 - left2, left2);
59
60 - if ((len2 = get_rdata(header, plen, end2, buff2 + left2, &p2, &dp2)) == 0)
61 + if ((len2 = get_rdata(header, plen, end2, buff2 + left2, MAXDNAME - left2, &p2, &dp2)) == 0)
62 {
63 quit = 1;
64 len2 = end2 - p2;
65 @@ -808,7 +819,7 @@ static int validate_rrset(time_t now, struct dns_header *header, size_t plen, in
66 /* canonicalise rdata and calculate length of same, use name buffer as workspace */
67 cp = p;
68 dp = rr_desc;
69 - for (len = 0; (seg = get_rdata(header, plen, end, name, &cp, &dp)) != 0; len += seg);
70 + for (len = 0; (seg = get_rdata(header, plen, end, name, MAXDNAME, &cp, &dp)) != 0; len += seg);
71 len += end - cp;
72 len = htons(len);
73 hash->update(ctx, 2, (unsigned char *)&len);
74 @@ -816,7 +827,7 @@ static int validate_rrset(time_t now, struct dns_header *header, size_t plen, in
75 /* Now canonicalise again and digest. */
76 cp = p;
77 dp = rr_desc;
78 - while ((seg = get_rdata(header, plen, end, name, &cp, &dp)))
79 + while ((seg = get_rdata(header, plen, end, name, MAXDNAME, &cp, &dp)))
80 hash->update(ctx, seg, (unsigned char *)name);
81 if (cp != end)
82 hash->update(ctx, end - cp, cp);
83 --
84 1.7.10.4
85