dns_message_t *message = NULL;
dns_name_t *query_name = NULL, *mname = NULL;
dns_rdataset_t *mrdataset = NULL;
- dns_rdataset_t *opt = NULL;
dns_request_t *request = NULL;
/* Construct query message */
mname = NULL;
dns_message_ednsinit(message, 0, 0, DNS_MESSAGEEXTFLAG_DO, 0);
- CHECK(dns_message_buildopt(message, &opt));
- CHECK(dns_message_setopt(message, opt));
+ CHECK(dns_message_setopt(message));
CHECK(dns_requestmgr_create(isc_g_mctx, dispatchmgr, NULL, NULL,
&requestmgr));
char cookiebuf[256];
char *origin = NULL;
char *textname = NULL;
- dns_rdataset_t *rdataset = NULL;
REQUIRE(lookup != NULL);
lookup->padding);
}
- result = dns_message_buildopt(lookup->sendmsg, &rdataset);
- check_result(result, "dns_message_buildopt");
- result = dns_message_setopt(lookup->sendmsg, rdataset);
+ result = dns_message_setopt(lookup->sendmsg);
check_result(result, "dns_message_setopt");
}
static void
updateopt(void) {
isc_result_t result;
- dns_rdataset_t *opt = NULL;
unsigned char ul[8];
isc_buffer_t b;
dns_ednsopt_t option = {
dns_message_ednsinit(updatemsg, 0, DEFAULT_EDNS_BUFSIZE, 0, 0);
dns_message_ednsaddopt(updatemsg, &option);
- result = dns_message_buildopt(updatemsg, &opt);
- check_result(result, "dns_message_buildopt");
- result = dns_message_setopt(updatemsg, opt);
+ result = dns_message_setopt(updatemsg);
+ check_result(result, "dns_message_setopt");
}
static uint16_t
unsigned int flags;
char ecsbuf[20];
unsigned char cookie[40];
- dns_rdataset_t *rdataset = NULL;
flags = query->ednsflags;
flags &= ~DNS_MESSAGEEXTFLAG_DO;
}
}
- result = dns_message_buildopt(message, &rdataset);
- CHECK("dns_message_buildopt", result);
- result = dns_message_setopt(message, rdataset);
+ result = dns_message_setopt(message);
CHECK("dns_message_setopt", result);
}
*/
isc_result_t
-dns_message_setopt(dns_message_t *msg, dns_rdataset_t *opt);
+dns_message_setopt(dns_message_t *msg);
/*%<
- * Set/clear the OPT record for 'msg'.
+ * Constructs an OPT record for 'msg', based on previous calls to
+ * dns_message_ednsinit() and dns_message_ednsaddopt().
*
* Requires:
*
- *\li 'msg' is a valid message with rendering intent
- * and no sections have been rendered.
- *
- *\li 'opt' is a valid OPT rdataset or NULL.
+ *\li 'msg' is a valid message with rendering intent,
+ * no sections have been rendered., and dns_message_ednsinit()
+ * has been run.
*
* Ensures:
*
- *\li The OPT record has either been freed or ownership of it has
- * been transferred to the message.
- *
*\li If ISC_R_SUCCESS was returned, the OPT record will be rendered
* when dns_message_renderend() is called.
*
*\li ISC_R_NOSPACE
*/
-isc_result_t
-dns_message_buildopt(dns_message_t *msg, dns_rdataset_t **opt);
-
-/*%<
- * Build an opt record.
- *
- * Requires:
- *\li msg be a valid message.
- *\li opt to be a non NULL and *opt to be NULL.
- *
- * Returns:
- *\li ISC_R_SUCCESS
- *\li ISC_R_NOSPACE
- */
-
void
dns_message_setclass(dns_message_t *msg, dns_rdataclass_t rdclass);
/*%<
isc_logcategory_t category, isc_logmodule_t module,
const dns_master_style_t *style, int level, isc_mem_t *mctx);
+static isc_result_t
+buildopt(dns_message_t *message, dns_rdataset_t **rdatasetp);
+
/*
* Allocate a new dns_msgblock_t, and return a pointer to it. If no memory
* is free, return NULL.
}
isc_result_t
-dns_message_setopt(dns_message_t *msg, dns_rdataset_t *opt) {
+dns_message_setopt(dns_message_t *msg) {
isc_result_t result;
+ dns_rdataset_t *opt = NULL;
dns_rdata_t rdata = DNS_RDATA_INIT;
/*
*/
REQUIRE(DNS_MESSAGE_VALID(msg));
- REQUIRE(opt == NULL || DNS_RDATASET_VALID(opt));
- REQUIRE(opt == NULL || opt->type == dns_rdatatype_opt);
REQUIRE(msg->from_to_wire == DNS_MESSAGE_INTENTRENDER);
REQUIRE(msg->state == DNS_SECTION_ANY);
- msgresetopt(msg);
-
- if (opt == NULL) {
- return ISC_R_SUCCESS;
+ result = buildopt(msg, &opt);
+ if (result != ISC_R_SUCCESS) {
+ return result;
}
+ msgresetopt(msg);
+
result = dns_rdataset_first(opt);
if (result != ISC_R_SUCCESS) {
goto cleanup;
return ISC_R_SUCCESS;
}
-isc_result_t
-dns_message_buildopt(dns_message_t *message, dns_rdataset_t **rdatasetp) {
+static isc_result_t
+buildopt(dns_message_t *message, dns_rdataset_t **rdatasetp) {
dns_rdataset_t *rdataset = NULL;
dns_rdatalist_t *rdatalist = NULL;
dns_rdata_t *rdata = NULL;
bool tcpkeepalive = false;
unsigned char cookie[COOKIE_BUFFER_SIZE];
uint16_t padding = 0;
- dns_rdataset_t *rdataset = NULL;
/*
* Set the default UDP size to what was
dns_message_setpadding(fctx->qmessage, padding);
}
- result = dns_message_buildopt(fctx->qmessage,
- &rdataset);
- if (result == ISC_R_SUCCESS) {
- result = dns_message_setopt(fctx->qmessage,
- rdataset);
- }
-
+ result = dns_message_setopt(fctx->qmessage);
if (result == ISC_R_SUCCESS) {
if (reqnsid) {
query->options |= DNS_FETCHOPT_WANTNSID;
add_opt(dns_message_t *message, uint16_t udpsize, bool reqnsid,
bool reqexpire) {
isc_result_t result;
- dns_rdataset_t *rdataset = NULL;
dns_message_ednsinit(message, 0, udpsize, 0, 0);
}
}
- result = dns_message_buildopt(message, &rdataset);
- if (result != ISC_R_SUCCESS) {
- return result;
- }
-
- return dns_message_setopt(message, rdataset);
+ return dns_message_setopt(message);
}
/*
add_opt(dns_message_t *message, uint16_t udpsize, bool reqnsid,
bool reqexpire) {
isc_result_t result;
- dns_rdataset_t *rdataset = NULL;
dns_message_ednsinit(message, 0, udpsize, 0, 0);
}
}
- result = dns_message_buildopt(message, &rdataset);
- if (result != ISC_R_SUCCESS) {
- return result;
- }
-
- return dns_message_setopt(message, rdataset);
+ return dns_message_setopt(message);
}
/*
#endif /* ifdef ENABLE_AFL */
dns_view_detach(&client->inner.view);
}
- if (client->inner.opt != NULL) {
- INSIST(dns_rdataset_isassociated(client->inner.opt));
- dns_rdataset_disassociate(client->inner.opt);
- dns_message_puttemprdataset(client->message,
- &client->inner.opt);
- }
client_zoneversion_reset(client);
client->inner.signer = NULL;
* Create an OPT for our reply.
*/
if ((client->inner.attributes & NS_CLIENTATTR_WANTOPT) != 0) {
- result = ns_client_addopt(client, client->message,
- &client->inner.opt);
+ result = ns_client_addopt(client, client->message);
if (result != ISC_R_SUCCESS) {
goto cleanup;
}
goto cleanup;
}
- if (client->inner.opt != NULL) {
- result = dns_message_setopt(client->message, client->inner.opt);
- opt_included = true;
- client->inner.opt = NULL;
- if (result != ISC_R_SUCCESS) {
- goto cleanup;
- }
- }
result = dns_message_rendersection(client->message,
DNS_SECTION_QUESTION, 0);
if (result == ISC_R_NOSPACE) {
}
isc_result_t
-ns_client_addopt(ns_client_t *client, dns_message_t *message,
- dns_rdataset_t **opt) {
+ns_client_addopt(ns_client_t *client, dns_message_t *message) {
unsigned char ecs[ECS_SIZE];
unsigned char cookie[COOKIE_SIZE];
isc_result_t result;
dns_aclenv_t *env = NULL;
REQUIRE(NS_CLIENT_VALID(client));
- REQUIRE(opt != NULL && *opt == NULL);
REQUIRE(message != NULL);
env = client->manager->aclenv;
}
}
- result = dns_message_buildopt(message, opt);
+ result = dns_message_setopt(message);
return result;
}
if (client->inner.ednsversion > DNS_EDNS_VERSION) {
ns_stats_increment(client->manager->sctx->nsstats,
ns_statscounter_badednsver);
- result = ns_client_addopt(client, client->message,
- &client->inner.opt);
- if (result == ISC_R_SUCCESS) {
- result = DNS_R_BADVERS;
- }
+ result = DNS_R_BADVERS;
+ client->inner.attributes |= NS_CLIENTATTR_WANTOPT;
ns_client_error(client, result);
return result;
}
return result;
formerr:
- if (result == DNS_R_FORMERR || result == DNS_R_OPTERR) {
- result = ns_client_addopt(client, client->message,
- &client->inner.opt);
- if (result == ISC_R_SUCCESS) {
- result = DNS_R_FORMERR;
- }
+ if (result == DNS_R_OPTERR) {
+ result = DNS_R_FORMERR;
}
+ client->inner.attributes |= NS_CLIENTATTR_WANTOPT;
ns_client_error(client, result);
return result;
}
client->magic = 0;
- if (client->inner.opt != NULL) {
- INSIST(dns_rdataset_isassociated(client->inner.opt));
- dns_rdataset_disassociate(client->inner.opt);
- dns_message_puttemprdataset(client->message,
- &client->inner.opt);
- }
-
ns_client_async_reset(client);
dns_message_detach(&client->message);
* (typically FORMERR or SERVFAIL).
*/
if (result == DNS_R_OPTERR) {
- (void)ns_client_addopt(client, client->message,
- &client->inner.opt);
+ client->inner.attributes |= NS_CLIENTATTR_WANTOPT;
}
-
ns_client_log(client, NS_LOGCATEGORY_CLIENT,
NS_LOGMODULE_CLIENT, ISC_LOG_DEBUG(1),
"message parsing failed: %s",
isc_nmhandle_t *updatehandle; /* Waiting for update callback */
isc_nmhandle_t *restarthandle; /* Waiting for restart callback
*/
- unsigned char *tcpbuf;
- size_t tcpbuf_size;
- dns_rdataset_t *opt;
- uint16_t udpsize;
- uint16_t extflags;
- int16_t ednsversion; /* -1 noedns */
- uint16_t additionaldepth;
+ unsigned char *tcpbuf;
+ size_t tcpbuf_size;
+ uint16_t udpsize;
+ uint16_t extflags;
+ int16_t ednsversion; /* -1 noedns */
+ uint16_t additionaldepth;
void (*cleanup)(ns_client_t *);
isc_time_t requesttime;
isc_stdtime_t now;
ns_client_sourceip(dns_clientinfo_t *ci, isc_sockaddr_t **addrp);
isc_result_t
-ns_client_addopt(ns_client_t *client, dns_message_t *message,
- dns_rdataset_t **opt);
+ns_client_addopt(ns_client_t *client, dns_message_t *message);
/*%<
* Get a client object from the inactive queue, or create one, as needed.
if ((xfr->client->inner.attributes & NS_CLIENTATTR_WANTOPT) !=
0)
{
- dns_rdataset_t *opt = NULL;
-
- CHECK(ns_client_addopt(xfr->client, msg, &opt));
- CHECK(dns_message_setopt(msg, opt));
+ CHECK(ns_client_addopt(xfr->client, msg));
/*
* Add to first message only.
*/