]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Clone the saved / query message buffers
authorMark Andrews <marka@isc.org>
Fri, 18 Sep 2020 05:00:35 +0000 (15:00 +1000)
committerMark Andrews <marka@isc.org>
Wed, 23 Sep 2020 00:37:42 +0000 (10:37 +1000)
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.

lib/dns/include/dns/message.h
lib/dns/message.c
lib/dns/win32/libdns.def.in
lib/ns/query.c
lib/ns/update.c

index ef983c3814f125afcf537f3257fec4831ab38725..b89cc6b6d5c268204ba2611a6d48083937218e47 100644 (file)
@@ -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 */
index 3c3c537cebacea5fd2160c2de1a6187be3bcd662..98fa9177e8fc47a48abd6e39f9d8f72cfa5cc7a5 100644 (file)
@@ -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;
+       }
+}
index 8b5eecb70f7dfe5790cd932f1ff9831c35c2d98e..e3f6aed4ea814b136188e8b6b385077d01f12aef 100644 (file)
@@ -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
index 2e1b27d78def3e77db46611d616a836a1162698c..6df111b9ea7fe24d1c7c14908c0f32811bd2fa63 100644 (file)
@@ -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;
index 0c0546d1d4fd0c28527ba9dd2c8c4bb9a59a6123..ce424ca87f83f3b02f95ec532c3fb3f33dca77e4 100644 (file)
@@ -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: