if(!inplace_cb_reply_local_call(&worker->env, NULL, NULL, NULL,
LDNS_RCODE_NOERROR, edns, worker->scratchpad))
edns->opt_list = NULL;
- attach_edns_record(pkt, edns);
+ if(sldns_buffer_capacity(pkt) >=
+ sldns_buffer_limit(pkt)+calc_edns_field_size(edns))
+ attach_edns_record(pkt, edns);
}
/** Reply with one string */
error_encode(c->buffer, EDNS_RCODE_BADVERS&0xf, &qinfo,
*(uint16_t*)(void *)sldns_buffer_begin(c->buffer),
sldns_buffer_read_u16_at(c->buffer, 2), NULL);
- attach_edns_record(c->buffer, &edns);
+ if(sldns_buffer_capacity(c->buffer) >=
+ sldns_buffer_limit(c->buffer)+calc_edns_field_size(&edns))
+ attach_edns_record(c->buffer, &edns);
regional_free_all(worker->scratchpad);
goto send_reply;
}
sldns_buffer_clear(buffer);
if(udpsize < sldns_buffer_limit(buffer))
sldns_buffer_set_limit(buffer, udpsize);
+ else if(sldns_buffer_limit(buffer) < udpsize)
+ udpsize = sldns_buffer_limit(buffer);
if(sldns_buffer_remaining(buffer) < LDNS_HEADER_SIZE)
return 0;
struct edns_data* edns, int dnssec, int secure)
{
uint16_t flags;
- int attach_edns = 1;
+ unsigned int attach_edns = 0;
if(!cached || rep->authoritative) {
/* original flags, copy RD and CD bits from query. */
log_assert(flags & BIT_QR); /* QR bit must be on in our replies */
if(udpsize < LDNS_HEADER_SIZE)
return 0;
+ if(sldns_buffer_capacity(pkt) < udpsize)
+ udpsize = sldns_buffer_capacity(pkt);
if(udpsize < LDNS_HEADER_SIZE + calc_edns_field_size(edns)) {
/* packet too small to contain edns, omit it. */
attach_edns = 0;
} else {
/* reserve space for edns record */
- udpsize -= calc_edns_field_size(edns);
+ attach_edns = (int)calc_edns_field_size(edns);
+ udpsize -= attach_edns;
}
if(!reply_info_encode(qinf, rep, id, flags, pkt, timenow, region,
log_err("reply encode: out of memory");
return 0;
}
- if(attach_edns)
+ if(attach_edns && sldns_buffer_capacity(pkt) >=
+ sldns_buffer_limit(pkt)+attach_edns)
attach_edns_record(pkt, edns);
return 1;
}