diff --git a/bin/named/client.c b/bin/named/client.c index 1c128c8241..da9465efb1 100644 --- a/bin/named/client.c +++ b/bin/named/client.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: client.c,v 1.149 2001/02/14 01:46:59 bwelling Exp $ */ +/* $Id: client.c,v 1.150 2001/02/14 02:51:12 gson Exp $ */ #include @@ -823,12 +823,12 @@ ns_client_send(ns_client_t *client) { goto done; if (client->opt != NULL) { result = dns_message_setopt(client->message, client->opt); - if (result != ISC_R_SUCCESS) - goto done; /* * XXXRTH dns_message_setopt() should probably do this... */ client->opt = NULL; + if (result != ISC_R_SUCCESS) + goto done; } result = dns_message_rendersection(client->message, DNS_SECTION_QUESTION, 0); diff --git a/lib/dns/include/dns/message.h b/lib/dns/include/dns/message.h index 2b4bf54536..1195886248 100644 --- a/lib/dns/include/dns/message.h +++ b/lib/dns/include/dns/message.h @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: message.h,v 1.91 2001/02/13 01:02:59 bwelling Exp $ */ +/* $Id: message.h,v 1.92 2001/02/14 02:51:09 gson Exp $ */ #ifndef DNS_MESSAGE_H #define DNS_MESSAGE_H 1 @@ -960,8 +960,11 @@ dns_message_setopt(dns_message_t *msg, dns_rdataset_t *opt); * * Ensures: * - * The OPT record will be rendered when dns_message_renderend() is - * called. + * The OPT record has either been freed or ownership of it has + * been transferred to the message. + * + * If ISC_R_SUCCESS was returned, the OPT record will be rendered + * when dns_message_renderend() is called. * * Returns: * diff --git a/lib/dns/message.c b/lib/dns/message.c index 55568d47cc..969b44fc3d 100644 --- a/lib/dns/message.c +++ b/lib/dns/message.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: message.c,v 1.176 2001/02/13 01:29:33 bwelling Exp $ */ +/* $Id: message.c,v 1.177 2001/02/14 02:51:11 gson Exp $ */ /*** *** Imports @@ -2411,18 +2411,23 @@ dns_message_setopt(dns_message_t *msg, dns_rdataset_t *opt) { result = dns_rdataset_first(opt); if (result != ISC_R_SUCCESS) - return (result); + goto cleanup; dns_rdataset_current(opt, &rdata); msg->opt_reserved = 11 + rdata.length; result = dns_message_renderreserve(msg, msg->opt_reserved); if (result != ISC_R_SUCCESS) { msg->opt_reserved = 0; - return (result); + goto cleanup; } msg->opt = opt; return (ISC_R_SUCCESS); + + cleanup: + dns_message_puttemprdataset(msg, &opt); + return (result); + } dns_rdataset_t *