mirror of
https://github.com/isc-projects/bind9.git
synced 2026-06-03 13:59:27 -04:00
Clone the saved / query message buffers
The message buffer passed to ns__client_request is only valid for the life of the the ns__client_request call. Save a copy of it when we recurse or process a update as ns__client_request will return before those operations complete.
This commit is contained in:
parent
ab19d0a73d
commit
f0d9bf7c30
5 changed files with 31 additions and 0 deletions
|
|
@ -1486,6 +1486,16 @@ dns_message_setpadding(dns_message_t *msg, uint16_t padding);
|
|||
* \li msg be a valid message.
|
||||
*/
|
||||
|
||||
void
|
||||
dns_message_clonebuffer(dns_message_t *msg);
|
||||
/*%<
|
||||
* Clone the query or saved buffers if they where not cloned
|
||||
* when parsing.
|
||||
*
|
||||
* Requires:
|
||||
* \li msg be a valid message.
|
||||
*/
|
||||
|
||||
ISC_LANG_ENDDECLS
|
||||
|
||||
#endif /* DNS_MESSAGE_H */
|
||||
|
|
|
|||
|
|
@ -4749,3 +4749,21 @@ dns_message_setpadding(dns_message_t *msg, uint16_t padding) {
|
|||
}
|
||||
msg->padding = padding;
|
||||
}
|
||||
|
||||
void
|
||||
dns_message_clonebuffer(dns_message_t *msg) {
|
||||
REQUIRE(DNS_MESSAGE_VALID(msg));
|
||||
|
||||
if (msg->free_saved == 0 && msg->saved.base != NULL) {
|
||||
msg->saved.base =
|
||||
memmove(isc_mem_get(msg->mctx, msg->saved.length),
|
||||
msg->saved.base, msg->saved.length);
|
||||
msg->free_saved = 1;
|
||||
}
|
||||
if (msg->free_query == 0 && msg->query.base != NULL) {
|
||||
msg->query.base =
|
||||
memmove(isc_mem_get(msg->mctx, msg->query.length),
|
||||
msg->query.base, msg->query.length);
|
||||
msg->free_query = 1;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -524,6 +524,7 @@ dns_master_styleflags
|
|||
dns_message_addname
|
||||
dns_message_buildopt
|
||||
dns_message_checksig
|
||||
dns_message_clonebuffer
|
||||
dns_message_create
|
||||
dns_message_currentname
|
||||
dns_message_destroy
|
||||
|
|
|
|||
|
|
@ -5897,6 +5897,7 @@ ns_query_recurse(ns_client_t *client, dns_rdatatype_t qtype, dns_name_t *qname,
|
|||
return (result);
|
||||
}
|
||||
|
||||
dns_message_clonebuffer(client->message);
|
||||
ns_client_recursing(client);
|
||||
} else if ((client->attributes & NS_CLIENTATTR_RECURSING) == 0) {
|
||||
client->attributes |= NS_CLIENTATTR_RECURSING;
|
||||
|
|
|
|||
|
|
@ -1666,6 +1666,7 @@ ns_update_start(ns_client_t *client, isc_nmhandle_t *handle,
|
|||
if (sigresult != ISC_R_SUCCESS) {
|
||||
FAIL(sigresult);
|
||||
}
|
||||
dns_message_clonebuffer(client->message);
|
||||
CHECK(send_update_event(client, zone));
|
||||
break;
|
||||
case dns_zone_slave:
|
||||
|
|
|
|||
Loading…
Reference in a new issue