mirror of
https://github.com/isc-projects/bind9.git
synced 2026-05-28 04:34:54 -04:00
move compression context create/delete into the caller of the message
rendering functions. This reduces the size of the message object.
This commit is contained in:
parent
dc2e09d48b
commit
e43b9a2005
12 changed files with 130 additions and 56 deletions
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: dighost.c,v 1.194 2001/02/24 20:53:26 bwelling Exp $ */
|
||||
/* $Id: dighost.c,v 1.195 2001/03/05 21:15:32 bwelling Exp $ */
|
||||
|
||||
/*
|
||||
* Notice to programmers: Do not use this code as an example of how to
|
||||
|
|
@ -1264,6 +1264,7 @@ setup_lookup(dig_lookup_t *lookup) {
|
|||
dig_query_t *query;
|
||||
isc_region_t r;
|
||||
isc_buffer_t b;
|
||||
dns_compress_t cctx;
|
||||
char store[MXNAME];
|
||||
|
||||
REQUIRE(lookup != NULL);
|
||||
|
|
@ -1439,9 +1440,13 @@ setup_lookup(dig_lookup_t *lookup) {
|
|||
if (lookup->sendspace == NULL)
|
||||
fatal("memory allocation failure");
|
||||
|
||||
result = dns_compress_init(&cctx, -1, mctx);
|
||||
check_result(result, "dns_compress_init");
|
||||
|
||||
debug("starting to render the message");
|
||||
isc_buffer_init(&lookup->sendbuf, lookup->sendspace, COMMSIZE);
|
||||
result = dns_message_renderbegin(lookup->sendmsg, &lookup->sendbuf);
|
||||
result = dns_message_renderbegin(lookup->sendmsg, &cctx,
|
||||
&lookup->sendbuf);
|
||||
check_result(result, "dns_message_renderbegin");
|
||||
#ifndef DNS_OPT_NEWCODES_LIVE
|
||||
if (lookup->udpsize > 0 || lookup->dnssec) {
|
||||
|
|
@ -1450,7 +1455,7 @@ setup_lookup(dig_lookup_t *lookup) {
|
|||
lookup->zonename[0] != 0 || lookup->viewname[0] != 0) {
|
||||
dns_fixedname_t fname;
|
||||
isc_buffer_t namebuf, *wirebuf = NULL;
|
||||
dns_compress_t cctx;
|
||||
dns_compress_t zcctx;
|
||||
dns_optlist_t optlist;
|
||||
dns_optattr_t optattr[2];
|
||||
#endif /* DNS_OPT_NEWCODES_LIVE */
|
||||
|
|
@ -1474,12 +1479,12 @@ setup_lookup(dig_lookup_t *lookup) {
|
|||
dns_rootname, ISC_FALSE,
|
||||
NULL);
|
||||
check_result(result, "; illegal zone option");
|
||||
result = dns_compress_init(&cctx, 0, mctx);
|
||||
result = dns_compress_init(&zcctx, 0, mctx);
|
||||
check_result(result, "dns_compress_init");
|
||||
result = isc_buffer_allocate(mctx, &wirebuf,
|
||||
MXNAME);
|
||||
check_result(result, "isc_buffer_allocate");
|
||||
result = dns_name_towire(&(fname.name), &cctx,
|
||||
result = dns_name_towire(&(fname.name), &zcctx,
|
||||
wirebuf);
|
||||
check_result(result, "dns_name_towire");
|
||||
optattr[optlist.used].value.base =
|
||||
|
|
@ -1487,7 +1492,7 @@ setup_lookup(dig_lookup_t *lookup) {
|
|||
optattr[optlist.used].value.length =
|
||||
isc_buffer_usedlength(wirebuf);
|
||||
optlist.used++;
|
||||
dns_compress_invalidate(&cctx);
|
||||
dns_compress_invalidate(&zcctx);
|
||||
}
|
||||
if (lookup->viewname[0] != 0) {
|
||||
optattr[optlist.used].code = DNS_OPTCODE_VIEW;
|
||||
|
|
@ -1516,6 +1521,8 @@ setup_lookup(dig_lookup_t *lookup) {
|
|||
check_result(result, "dns_message_renderend");
|
||||
debug("done rendering");
|
||||
|
||||
dns_compress_invalidate(&cctx);
|
||||
|
||||
/*
|
||||
* Force TCP mode if the request is larger than 512 bytes.
|
||||
*/
|
||||
|
|
@ -2678,7 +2685,7 @@ get_address(char *host, in_port_t port, isc_sockaddr_t *sockaddr) {
|
|||
fatal("Couldn't find server '%s': %s",
|
||||
host, gai_strerror(result));
|
||||
}
|
||||
memcpy(&sockaddr->type.sa,res->ai_addr, res->ai_addrlen);
|
||||
memcpy(&sockaddr->type.sa, res->ai_addr, res->ai_addrlen);
|
||||
sockaddr->length = res->ai_addrlen;
|
||||
isc_sockaddr_setport(sockaddr, port);
|
||||
freeaddrinfo(res);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||
# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
# $Id: Makefile.in,v 1.68 2001/03/04 21:21:19 bwelling Exp $
|
||||
# $Id: Makefile.in,v 1.69 2001/03/05 21:15:34 bwelling Exp $
|
||||
|
||||
srcdir = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
|
|
@ -26,10 +26,10 @@ top_srcdir = @top_srcdir@
|
|||
#
|
||||
# Add database drivers here.
|
||||
#
|
||||
DBDRIVER_OBJS =
|
||||
DBDRIVER_SRCS =
|
||||
DBDRIVER_OBJS = pgsqldb.o
|
||||
DBDRIVER_SRCS = pgsqldb.c
|
||||
DBDRIVER_INCLUDES =
|
||||
DBDRIVER_LIBS =
|
||||
DBDRIVER_LIBS = -lpq
|
||||
|
||||
CINCLUDES = -I${srcdir}/include -I${srcdir}/unix/include \
|
||||
${LWRES_INCLUDES} ${OMAPI_INCLUDES} ${DNS_INCLUDES} \
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: client.c,v 1.154 2001/02/23 22:38:28 bwelling Exp $ */
|
||||
/* $Id: client.c,v 1.155 2001/03/05 21:15:35 bwelling Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -803,6 +803,8 @@ ns_client_send(ns_client_t *client) {
|
|||
isc_buffer_t buffer;
|
||||
isc_buffer_t tcpbuffer;
|
||||
isc_region_t r;
|
||||
dns_compress_t cctx;
|
||||
isc_boolean_t cleanup_cctx = ISC_FALSE;
|
||||
|
||||
REQUIRE(NS_CLIENT_VALID(client));
|
||||
|
||||
|
|
@ -818,7 +820,12 @@ ns_client_send(ns_client_t *client) {
|
|||
if (result != ISC_R_SUCCESS)
|
||||
goto done;
|
||||
|
||||
result = dns_message_renderbegin(client->message, &buffer);
|
||||
result = dns_compress_init(&cctx, -1, client->mctx);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto done;
|
||||
cleanup_cctx = ISC_TRUE;
|
||||
|
||||
result = dns_message_renderbegin(client->message, &cctx, &buffer);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto done;
|
||||
if (client->opt != NULL) {
|
||||
|
|
@ -864,6 +871,11 @@ ns_client_send(ns_client_t *client) {
|
|||
if (result != ISC_R_SUCCESS)
|
||||
goto done;
|
||||
|
||||
if (cleanup_cctx) {
|
||||
dns_compress_invalidate(&cctx);
|
||||
cleanup_cctx = ISC_FALSE;
|
||||
}
|
||||
|
||||
if (TCP_CLIENT(client)) {
|
||||
isc_buffer_usedregion(&buffer, &r);
|
||||
isc_buffer_putuint16(&tcpbuffer, (isc_uint16_t) r.length);
|
||||
|
|
@ -879,6 +891,10 @@ ns_client_send(ns_client_t *client) {
|
|||
isc_mem_put(client->mctx, client->tcpbuf, TCP_BUFFER_SIZE);
|
||||
client->tcpbuf = NULL;
|
||||
}
|
||||
|
||||
if (cleanup_cctx)
|
||||
dns_compress_invalidate(&cctx);
|
||||
|
||||
ns_client_next(client, result);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: main.c,v 1.103 2001/01/11 23:46:10 bwelling Exp $ */
|
||||
/* $Id: main.c,v 1.104 2001/03/05 21:15:36 bwelling Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -56,6 +56,7 @@
|
|||
* Include header files for database drivers here.
|
||||
*/
|
||||
/* #include "xxdb.h" */
|
||||
#include "pgsqldb.h"
|
||||
|
||||
static isc_boolean_t want_stats = ISC_FALSE;
|
||||
static const char * program_name = "named";
|
||||
|
|
@ -496,6 +497,7 @@ setup(void) {
|
|||
* Add calls to register sdb drivers here.
|
||||
*/
|
||||
/* xxdb_init(); */
|
||||
pgsqldb_init();
|
||||
|
||||
ns_server_create(ns_g_mctx, &ns_g_server);
|
||||
|
||||
|
|
@ -517,6 +519,7 @@ cleanup(void) {
|
|||
* Add calls to unregister sdb drivers here.
|
||||
*/
|
||||
/* xxdb_clear(); */
|
||||
pgsqldb_clear();
|
||||
|
||||
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
|
||||
ISC_LOG_NOTICE, "exiting");
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: xfrout.c,v 1.95 2001/02/26 03:52:30 marka Exp $ */
|
||||
/* $Id: xfrout.c,v 1.96 2001/03/05 21:15:37 bwelling Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -1263,6 +1263,8 @@ sendstream(xfrout_ctx_t *xfr) {
|
|||
dns_rdata_t *msgrdata = NULL;
|
||||
dns_rdatalist_t *msgrdl = NULL;
|
||||
dns_rdataset_t *msgrds = NULL;
|
||||
dns_compress_t cctx;
|
||||
isc_boolean_t cleanup_cctx = ISC_FALSE;
|
||||
|
||||
int n_rrs;
|
||||
|
||||
|
|
@ -1448,10 +1450,14 @@ sendstream(xfrout_ctx_t *xfr) {
|
|||
}
|
||||
|
||||
if ((xfr->client->attributes & NS_CLIENTATTR_TCP) != 0) {
|
||||
CHECK(dns_message_renderbegin(msg, &xfr->txbuf));
|
||||
CHECK(dns_compress_init(&cctx, -1, xfr->mctx));
|
||||
cleanup_cctx = ISC_TRUE;
|
||||
CHECK(dns_message_renderbegin(msg, &cctx, &xfr->txbuf));
|
||||
CHECK(dns_message_rendersection(msg, DNS_SECTION_QUESTION, 0));
|
||||
CHECK(dns_message_rendersection(msg, DNS_SECTION_ANSWER, 0));
|
||||
CHECK(dns_message_renderend(msg));
|
||||
dns_compress_invalidate(&cctx);
|
||||
cleanup_cctx = ISC_FALSE;
|
||||
|
||||
isc_buffer_usedregion(&xfr->txbuf, &used);
|
||||
isc_buffer_putuint16(&xfr->txlenbuf, used.length);
|
||||
|
|
@ -1497,6 +1503,8 @@ sendstream(xfrout_ctx_t *xfr) {
|
|||
if (tcpmsg != NULL)
|
||||
dns_message_destroy(&tcpmsg);
|
||||
|
||||
if (cleanup_cctx)
|
||||
dns_compress_invalidate(&cctx);
|
||||
/*
|
||||
* Make sure to release any locks held by database
|
||||
* iterators before returning from the event handler.
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: sig0_test.c,v 1.5 2001/01/09 21:41:39 bwelling Exp $ */
|
||||
/* $Id: sig0_test.c,v 1.6 2001/03/05 21:15:38 bwelling Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -136,6 +136,7 @@ buildquery(void) {
|
|||
isc_buffer_t namesrc, namedst;
|
||||
unsigned char namedata[256];
|
||||
isc_sockaddr_t sa;
|
||||
dns_compress_t cctx;
|
||||
|
||||
query = NULL;
|
||||
result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &query);
|
||||
|
|
@ -162,6 +163,8 @@ buildquery(void) {
|
|||
|
||||
isc_buffer_init(&qbuffer, qdata, sizeof(qdata));
|
||||
|
||||
result = dns_compress_init(&cctx, -1, mctx);
|
||||
CHECK("dns_compress_init", result);
|
||||
result = dns_message_renderbegin(query, &qbuffer);
|
||||
CHECK("dns_message_renderbegin", result);
|
||||
result = dns_message_rendersection(query, DNS_SECTION_QUESTION, 0);
|
||||
|
|
@ -174,6 +177,7 @@ buildquery(void) {
|
|||
CHECK("dns_message_rendersection(add)", result);
|
||||
result = dns_message_renderend(query);
|
||||
CHECK("dns_message_renderend", result);
|
||||
dns_compress_invalidate(&cctx);
|
||||
|
||||
isc_buffer_init(&outbuf, output, sizeof(output));
|
||||
result = dns_message_totext(query, 0, &outbuf);
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: wire_test.c,v 1.54 2001/01/09 21:41:48 bwelling Exp $ */
|
||||
/* $Id: wire_test.c,v 1.55 2001/03/05 21:15:40 bwelling Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -62,10 +62,11 @@ main(int argc, char *argv[]) {
|
|||
int n;
|
||||
FILE *f;
|
||||
isc_boolean_t need_close = ISC_FALSE;
|
||||
unsigned char b[1000];
|
||||
char s[1000];
|
||||
unsigned char b[4000];
|
||||
char s[4000];
|
||||
dns_message_t *message;
|
||||
isc_result_t result;
|
||||
dns_compress_t cctx;
|
||||
isc_mem_t *mctx;
|
||||
|
||||
mctx = NULL;
|
||||
|
|
@ -126,7 +127,7 @@ main(int argc, char *argv[]) {
|
|||
CHECKRESULT(result, "dns_message_create failed");
|
||||
|
||||
result = dns_message_parse(message, &source, 0);
|
||||
CHECKRESULT(result, "dns_message_parse failed");
|
||||
/* CHECKRESULT(result, "dns_message_parse failed");*/
|
||||
|
||||
result = printmessage(message);
|
||||
CHECKRESULT(result, "printmessage() failed");
|
||||
|
|
@ -145,6 +146,9 @@ main(int argc, char *argv[]) {
|
|||
for (i = 0 ; i < DNS_SECTION_MAX ; i++)
|
||||
message->counts[i] = 0; /* Another hack XXX */
|
||||
|
||||
result = dns_compress_init(&cctx, -1, mctx);
|
||||
CHECKRESULT(result, "dns_compress_init() failed");
|
||||
|
||||
result = dns_message_renderbegin(message, &source);
|
||||
CHECKRESULT(result, "dns_message_renderbegin() failed");
|
||||
|
||||
|
|
@ -162,6 +166,8 @@ main(int argc, char *argv[]) {
|
|||
|
||||
dns_message_renderend(message);
|
||||
|
||||
dns_compress_invalidate(&cctx);
|
||||
|
||||
message->from_to_wire = DNS_MESSAGE_INTENTPARSE;
|
||||
dns_message_destroy(&message);
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: message.h,v 1.94 2001/02/23 01:52:18 bwelling Exp $ */
|
||||
/* $Id: message.h,v 1.95 2001/03/05 21:15:47 bwelling Exp $ */
|
||||
|
||||
#ifndef DNS_MESSAGE_H
|
||||
#define DNS_MESSAGE_H 1
|
||||
|
|
@ -182,7 +182,6 @@ struct dns_message {
|
|||
|
||||
int state;
|
||||
unsigned int from_to_wire : 2;
|
||||
unsigned int need_cctx_cleanup : 1;
|
||||
unsigned int header_ok : 1;
|
||||
unsigned int question_ok : 1;
|
||||
unsigned int tcp_continuation : 1;
|
||||
|
|
@ -196,7 +195,7 @@ struct dns_message {
|
|||
unsigned int reserved; /* reserved space (render) */
|
||||
|
||||
isc_buffer_t *buffer;
|
||||
dns_compress_t cctx;
|
||||
dns_compress_t *cctx;
|
||||
|
||||
isc_mem_t *mctx;
|
||||
isc_mempool_t *namepool;
|
||||
|
|
@ -417,11 +416,15 @@ dns_message_parse(dns_message_t *msg, isc_buffer_t *source,
|
|||
*/
|
||||
|
||||
isc_result_t
|
||||
dns_message_renderbegin(dns_message_t *msg, isc_buffer_t *buffer);
|
||||
dns_message_renderbegin(dns_message_t *msg, dns_compress_t *cctx,
|
||||
isc_buffer_t *buffer);
|
||||
/*
|
||||
* Begin rendering on a message. Only one call can be made to this function
|
||||
* per message.
|
||||
*
|
||||
* The compression context is "owned" by the message library until
|
||||
* dns_message_renderend() is called. It must be invalidated by the caller.
|
||||
*
|
||||
* The buffer is "owned" by the message library until dns_message_renderend()
|
||||
* is called.
|
||||
*
|
||||
|
|
@ -429,6 +432,8 @@ dns_message_renderbegin(dns_message_t *msg, isc_buffer_t *buffer);
|
|||
*
|
||||
* 'msg' be valid.
|
||||
*
|
||||
* 'cctx' be valid.
|
||||
*
|
||||
* 'buffer' is a valid buffer.
|
||||
*
|
||||
* Side Effects:
|
||||
|
|
@ -438,7 +443,6 @@ dns_message_renderbegin(dns_message_t *msg, isc_buffer_t *buffer);
|
|||
* Returns:
|
||||
* ISC_R_SUCCESS -- all is well
|
||||
* ISC_R_NOSPACE -- output buffer is too small
|
||||
* Anything that dns_compress_init() can return.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: message.c,v 1.184 2001/03/05 20:12:49 bwelling Exp $ */
|
||||
/* $Id: message.c,v 1.185 2001/03/05 21:15:41 bwelling Exp $ */
|
||||
|
||||
/***
|
||||
*** Imports
|
||||
|
|
@ -366,7 +366,6 @@ msginitprivate(dns_message_t *m) {
|
|||
m->sig_reserved = 0;
|
||||
m->reserved = 0;
|
||||
m->buffer = NULL;
|
||||
m->need_cctx_cleanup = 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
@ -586,9 +585,6 @@ msgreset(dns_message_t *msg, isc_boolean_t everything) {
|
|||
msgblock = next_msgblock;
|
||||
}
|
||||
|
||||
if (msg->need_cctx_cleanup == 1)
|
||||
dns_compress_invalidate(&msg->cctx);
|
||||
|
||||
if (msg->tsigkey != NULL) {
|
||||
dns_tsigkey_detach(&msg->tsigkey);
|
||||
msg->tsigkey = NULL;
|
||||
|
|
@ -734,6 +730,8 @@ dns_message_create(isc_mem_t *mctx, unsigned int intent, dns_message_t **msgp)
|
|||
goto cleanup;
|
||||
ISC_LIST_APPEND(m->scratchpad, dynbuf, link);
|
||||
|
||||
m->cctx = NULL;
|
||||
|
||||
*msgp = m;
|
||||
return (ISC_R_SUCCESS);
|
||||
|
||||
|
|
@ -1591,15 +1589,18 @@ dns_message_parse(dns_message_t *msg, isc_buffer_t *source,
|
|||
}
|
||||
|
||||
isc_result_t
|
||||
dns_message_renderbegin(dns_message_t *msg, isc_buffer_t *buffer) {
|
||||
dns_message_renderbegin(dns_message_t *msg, dns_compress_t *cctx,
|
||||
isc_buffer_t *buffer)
|
||||
{
|
||||
isc_region_t r;
|
||||
isc_result_t result;
|
||||
|
||||
REQUIRE(DNS_MESSAGE_VALID(msg));
|
||||
REQUIRE(buffer != NULL);
|
||||
REQUIRE(msg->buffer == NULL);
|
||||
REQUIRE(msg->from_to_wire == DNS_MESSAGE_INTENTRENDER);
|
||||
|
||||
msg->cctx = cctx;
|
||||
|
||||
/*
|
||||
* Erase the contents of this buffer.
|
||||
*/
|
||||
|
|
@ -1615,11 +1616,6 @@ dns_message_renderbegin(dns_message_t *msg, isc_buffer_t *buffer) {
|
|||
if (r.length < msg->reserved)
|
||||
return (ISC_R_NOSPACE);
|
||||
|
||||
result = dns_compress_init(&msg->cctx, -1, msg->mctx);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
msg->need_cctx_cleanup = 1;
|
||||
|
||||
/*
|
||||
* Reserve enough space for the header in this buffer.
|
||||
*/
|
||||
|
|
@ -1775,7 +1771,7 @@ dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid,
|
|||
count = 0;
|
||||
result = dns_rdataset_towiresorted(rdataset,
|
||||
name,
|
||||
&msg->cctx,
|
||||
msg->cctx,
|
||||
msg->buffer,
|
||||
msg->order,
|
||||
msg->order_arg,
|
||||
|
|
@ -1798,7 +1794,7 @@ dns_message_rendersection(dns_message_t *msg, dns_section_t sectionid,
|
|||
*/
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
INSIST(st.used < 65536);
|
||||
dns_compress_rollback(&msg->cctx,
|
||||
dns_compress_rollback(msg->cctx,
|
||||
(isc_uint16_t)st.used);
|
||||
*(msg->buffer) = st; /* rollback */
|
||||
msg->buffer->length += msg->reserved;
|
||||
|
|
@ -1900,7 +1896,7 @@ dns_message_renderend(dns_message_t *msg) {
|
|||
*/
|
||||
count = 0;
|
||||
result = dns_rdataset_towire(msg->opt, dns_rootname,
|
||||
&msg->cctx, msg->buffer, &count);
|
||||
msg->cctx, msg->buffer, &count);
|
||||
msg->counts[DNS_SECTION_ADDITIONAL] += count;
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
|
|
@ -1923,7 +1919,7 @@ dns_message_renderend(dns_message_t *msg) {
|
|||
msg->buffer = buf;
|
||||
isc_buffer_clear(msg->buffer);
|
||||
isc_buffer_add(msg->buffer, DNS_MESSAGE_HEADERLEN);
|
||||
dns_compress_rollback(&msg->cctx, 0);
|
||||
dns_compress_rollback(msg->cctx, 0);
|
||||
result = dns_message_rendersection(msg, DNS_SECTION_QUESTION,
|
||||
0);
|
||||
if (result != ISC_R_SUCCESS && result != ISC_R_NOSPACE)
|
||||
|
|
@ -1941,7 +1937,7 @@ dns_message_renderend(dns_message_t *msg) {
|
|||
return (result);
|
||||
count = 0;
|
||||
result = dns_rdataset_towire(msg->tsig, msg->tsigname,
|
||||
&msg->cctx, msg->buffer, &count);
|
||||
msg->cctx, msg->buffer, &count);
|
||||
msg->counts[DNS_SECTION_ADDITIONAL] += count;
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
|
|
@ -1963,7 +1959,7 @@ dns_message_renderend(dns_message_t *msg) {
|
|||
* be set in a message being rendered.
|
||||
*/
|
||||
result = dns_rdataset_towire(msg->sig0, dns_rootname,
|
||||
&msg->cctx, msg->buffer, &count);
|
||||
msg->cctx, msg->buffer, &count);
|
||||
msg->counts[DNS_SECTION_ADDITIONAL] += count;
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
|
|
@ -1976,9 +1972,6 @@ dns_message_renderend(dns_message_t *msg) {
|
|||
|
||||
msg->buffer = NULL; /* forget about this buffer only on success XXX */
|
||||
|
||||
dns_compress_invalidate(&msg->cctx);
|
||||
msg->need_cctx_cleanup = 0;
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: request.c,v 1.57 2001/02/13 21:06:25 gson Exp $ */
|
||||
/* $Id: request.c,v 1.58 2001/03/05 21:15:42 bwelling Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -25,6 +25,7 @@
|
|||
#include <isc/util.h>
|
||||
|
||||
#include <dns/acl.h>
|
||||
#include <dns/compress.h>
|
||||
#include <dns/dispatch.h>
|
||||
#include <dns/events.h>
|
||||
#include <dns/log.h>
|
||||
|
|
@ -935,6 +936,8 @@ req_render(dns_message_t *message, isc_buffer_t **bufferp,
|
|||
isc_result_t result;
|
||||
isc_region_t r;
|
||||
isc_boolean_t tcp = ISC_FALSE;
|
||||
dns_compress_t cctx;
|
||||
isc_boolean_t cleanup_cctx = ISC_FALSE;
|
||||
|
||||
REQUIRE(bufferp != NULL && *bufferp == NULL);
|
||||
|
||||
|
|
@ -947,10 +950,15 @@ req_render(dns_message_t *message, isc_buffer_t **bufferp,
|
|||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
|
||||
result = dns_compress_init(&cctx, -1, mctx);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
return (result);
|
||||
cleanup_cctx = ISC_TRUE;
|
||||
|
||||
/*
|
||||
* Render message.
|
||||
*/
|
||||
result = dns_message_renderbegin(message, buf1);
|
||||
result = dns_message_renderbegin(message, &cctx, buf1);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
result = dns_message_rendersection(message, DNS_SECTION_QUESTION, 0);
|
||||
|
|
@ -969,6 +977,9 @@ req_render(dns_message_t *message, isc_buffer_t **bufferp,
|
|||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup;
|
||||
|
||||
dns_compress_invalidate(&cctx);
|
||||
cleanup_cctx = ISC_FALSE;
|
||||
|
||||
/*
|
||||
* Copy rendered message to exact sized buffer.
|
||||
*/
|
||||
|
|
@ -1001,6 +1012,8 @@ req_render(dns_message_t *message, isc_buffer_t **bufferp,
|
|||
isc_buffer_free(&buf1);
|
||||
if (buf2 != NULL)
|
||||
isc_buffer_free(&buf2);
|
||||
if (cleanup_cctx)
|
||||
dns_compress_invalidate(&cctx);
|
||||
return (result);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: resolver.c,v 1.206 2001/02/28 21:19:53 bwelling Exp $ */
|
||||
/* $Id: resolver.c,v 1.207 2001/03/05 21:15:44 bwelling Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -854,6 +854,8 @@ resquery_send(resquery_t *query) {
|
|||
dns_peer_t *peer = NULL;
|
||||
isc_boolean_t bogus;
|
||||
isc_boolean_t aborted = ISC_FALSE;
|
||||
dns_compress_t cctx;
|
||||
isc_boolean_t cleanup_cctx = ISC_FALSE;
|
||||
|
||||
fctx = query->fctx;
|
||||
QTRACE("send");
|
||||
|
|
@ -926,7 +928,13 @@ resquery_send(resquery_t *query) {
|
|||
/*
|
||||
* Convert the question to wire format.
|
||||
*/
|
||||
result = dns_message_renderbegin(fctx->qmessage, &query->buffer);
|
||||
result = dns_compress_init(&cctx, -1, fctx->res->mctx);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_message;
|
||||
cleanup_cctx = ISC_TRUE;
|
||||
|
||||
result = dns_message_renderbegin(fctx->qmessage, &cctx,
|
||||
&query->buffer);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_message;
|
||||
|
||||
|
|
@ -1004,6 +1012,9 @@ resquery_send(resquery_t *query) {
|
|||
if (result != ISC_R_SUCCESS)
|
||||
goto cleanup_message;
|
||||
|
||||
dns_compress_invalidate(&cctx);
|
||||
cleanup_cctx = ISC_FALSE;
|
||||
|
||||
if (dns_message_gettsigkey(fctx->qmessage) != NULL) {
|
||||
dns_tsigkey_attach(dns_message_gettsigkey(fctx->qmessage),
|
||||
&query->tsigkey);
|
||||
|
|
@ -1083,6 +1094,9 @@ resquery_send(resquery_t *query) {
|
|||
return (ISC_R_SUCCESS);
|
||||
|
||||
cleanup_message:
|
||||
if (cleanup_cctx)
|
||||
dns_compress_invalidate(&cctx);
|
||||
|
||||
dns_message_reset(fctx->qmessage, DNS_MESSAGE_INTENTRENDER);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@
|
|||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: xfrin.c,v 1.114 2001/02/09 06:04:51 marka Exp $ */
|
||||
/* $Id: xfrin.c,v 1.115 2001/03/05 21:15:45 bwelling Exp $ */
|
||||
|
||||
#include <config.h>
|
||||
|
||||
|
|
@ -219,7 +219,7 @@ static void maybe_free(dns_xfrin_ctx_t *xfr);
|
|||
static void
|
||||
xfrin_fail(dns_xfrin_ctx_t *xfr, isc_result_t result, const char *msg);
|
||||
static isc_result_t
|
||||
render(dns_message_t *msg, isc_buffer_t *buf);
|
||||
render(dns_message_t *msg, isc_mem_t *mctx, isc_buffer_t *buf);
|
||||
|
||||
static void
|
||||
xfrin_logv(int level, dns_name_t *zonename, dns_rdataclass_t rdclass,
|
||||
|
|
@ -795,10 +795,14 @@ xfrin_start(dns_xfrin_ctx_t *xfr) {
|
|||
/* XXX the resolver could use this, too */
|
||||
|
||||
static isc_result_t
|
||||
render(dns_message_t *msg, isc_buffer_t *buf) {
|
||||
render(dns_message_t *msg, isc_mem_t *mctx, isc_buffer_t *buf) {
|
||||
dns_compress_t cctx;
|
||||
isc_boolean_t cleanup_cctx = ISC_FALSE;
|
||||
isc_result_t result;
|
||||
|
||||
CHECK(dns_message_renderbegin(msg, buf));
|
||||
CHECK(dns_compress_init(&cctx, -1, mctx));
|
||||
cleanup_cctx = ISC_TRUE;
|
||||
CHECK(dns_message_renderbegin(msg, &cctx, buf));
|
||||
CHECK(dns_message_rendersection(msg, DNS_SECTION_QUESTION, 0));
|
||||
CHECK(dns_message_rendersection(msg, DNS_SECTION_ANSWER, 0));
|
||||
CHECK(dns_message_rendersection(msg, DNS_SECTION_AUTHORITY, 0));
|
||||
|
|
@ -806,6 +810,8 @@ render(dns_message_t *msg, isc_buffer_t *buf) {
|
|||
CHECK(dns_message_renderend(msg));
|
||||
result = ISC_R_SUCCESS;
|
||||
failure:
|
||||
if (cleanup_cctx)
|
||||
dns_compress_invalidate(&cctx);
|
||||
return (result);
|
||||
}
|
||||
|
||||
|
|
@ -952,7 +958,7 @@ xfrin_send_request(dns_xfrin_ctx_t *xfr) {
|
|||
xfr->id++;
|
||||
msg->id = xfr->id;
|
||||
|
||||
CHECK(render(msg, &xfr->qbuffer));
|
||||
CHECK(render(msg, xfr->mctx, &xfr->qbuffer));
|
||||
|
||||
/*
|
||||
* Free the last tsig, if there is one.
|
||||
|
|
|
|||
Loading…
Reference in a new issue