]>
Commit | Line | Data |
---|---|---|
4a7813ac AM |
1 | --- a/avahi-core/dns.c |
2 | +++ b/avahi-core/dns.c | |
3 | @@ -55,6 +55,7 @@ | |
4 | ||
5 | p->size = p->rindex = AVAHI_DNS_PACKET_HEADER_SIZE; | |
6 | p->max_size = max_size; | |
7 | + p->res_size = 0; | |
8 | p->name_table = NULL; | |
9 | p->data = NULL; | |
10 | ||
11 | @@ -833,6 +834,25 @@ | |
12 | return p->max_size - p->size; | |
13 | } | |
14 | ||
15 | +size_t avahi_dns_packet_reserve_size(AvahiDnsPacket *p, size_t res_size) { | |
16 | + assert(p); | |
17 | + | |
18 | + assert(p->size + p->res_size <= p->max_size); | |
19 | + | |
20 | + if ((p->size + p->res_size + res_size) <= p->max_size) | |
21 | + p->res_size += res_size; | |
22 | + | |
23 | + return p->res_size; | |
24 | +} | |
25 | + | |
26 | +size_t avahi_dns_packet_reserved_space(AvahiDnsPacket *p) { | |
27 | + assert(p); | |
28 | + | |
29 | + assert(p->size + p->res_size <= p->max_size); | |
30 | + | |
31 | + return p->max_size - p->size - p->res_size; | |
32 | +} | |
33 | + | |
34 | int avahi_rdata_parse(AvahiRecord *record, const void* rdata, size_t size) { | |
35 | int ret; | |
36 | AvahiDnsPacket p; | |
37 | --- a/avahi-core/dns.h | |
38 | +++ b/avahi-core/dns.h | |
39 | @@ -30,7 +30,7 @@ | |
40 | #define AVAHI_DNS_PACKET_SIZE_MAX (AVAHI_DNS_PACKET_HEADER_SIZE + 256 + 2 + 2 + 4 + 2 + AVAHI_DNS_RDATA_MAX) | |
41 | ||
42 | typedef struct AvahiDnsPacket { | |
43 | - size_t size, rindex, max_size; | |
44 | + size_t size, rindex, max_size, res_size; | |
45 | AvahiHashmap *name_table; /* for name compression */ | |
46 | uint8_t *data; | |
47 | } AvahiDnsPacket; | |
48 | @@ -78,6 +78,8 @@ | |
49 | ||
50 | int avahi_dns_packet_is_empty(AvahiDnsPacket *p); | |
51 | size_t avahi_dns_packet_space(AvahiDnsPacket *p); | |
52 | +size_t avahi_dns_packet_reserve_size(AvahiDnsPacket *p, size_t res_size); | |
53 | +size_t avahi_dns_packet_reserved_space(AvahiDnsPacket *p); | |
54 | ||
55 | #define AVAHI_DNS_FIELD_ID 0 | |
56 | #define AVAHI_DNS_FIELD_FLAGS 1 | |
57 | --- a/avahi-core/probe-sched.c | |
58 | +++ b/avahi-core/probe-sched.c | |
59 | @@ -179,7 +179,7 @@ | |
60 | avahi_record_get_estimate_size(pj->record); | |
61 | ||
62 | /* Too large */ | |
63 | - if (size > avahi_dns_packet_space(p)) | |
64 | + if (size > avahi_dns_packet_reserved_space(p)) | |
65 | return 0; | |
66 | ||
67 | /* Create the probe query */ | |
68 | @@ -189,6 +189,9 @@ | |
69 | b = !!avahi_dns_packet_append_key(p, k, 0); | |
70 | assert(b); | |
71 | ||
72 | + /* reserve size for record data */ | |
73 | + avahi_dns_packet_reserve_size(p, avahi_record_get_estimate_size(pj->record)); | |
74 | + | |
75 | /* Mark this job for addition to the packet */ | |
76 | pj->chosen = 1; | |
77 | ||
78 | @@ -202,9 +205,12 @@ | |
79 | continue; | |
80 | ||
81 | /* This job wouldn't fit in */ | |
82 | - if (avahi_record_get_estimate_size(pj->record) > avahi_dns_packet_space(p)) | |
83 | + if (avahi_record_get_estimate_size(pj->record) > avahi_dns_packet_reserved_space(p)) | |
84 | break; | |
85 | ||
86 | + /* reserve size for record data */ | |
87 | + avahi_dns_packet_reserve_size(p, avahi_record_get_estimate_size(pj->record)); | |
88 | + | |
89 | /* Mark this job for addition to the packet */ | |
90 | pj->chosen = 1; | |
91 | } |