2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-03 08:05:21 +00:00

Add an arena to compressctx

This commit is contained in:
Witold Kręcicki
2020-02-03 11:17:32 +01:00
committed by Witold Krecicki
parent 9e7c37ba13
commit 3a3b5f557a
2 changed files with 20 additions and 4 deletions

View File

@@ -129,6 +129,7 @@ dns_compress_init(dns_compress_t *cctx, int edns, isc_mem_t *mctx) {
cctx->mctx = mctx; cctx->mctx = mctx;
cctx->count = 0; cctx->count = 0;
cctx->allowed = DNS_COMPRESS_ENABLED; cctx->allowed = DNS_COMPRESS_ENABLED;
cctx->arena_off = 0;
memset(&cctx->table[0], 0, sizeof(cctx->table)); memset(&cctx->table[0], 0, sizeof(cctx->table));
@@ -382,6 +383,7 @@ dns_compress_add(dns_compress_t *cctx, const dns_name_t *name,
uint16_t toffset; uint16_t toffset;
unsigned char *tmp; unsigned char *tmp;
isc_region_t r; isc_region_t r;
bool allocated = false;
REQUIRE(VALID_CCTX(cctx)); REQUIRE(VALID_CCTX(cctx));
REQUIRE(dns_name_isabsolute(name)); REQUIRE(dns_name_isabsolute(name));
@@ -407,7 +409,13 @@ dns_compress_add(dns_compress_t *cctx, const dns_name_t *name,
start = 0; start = 0;
dns_name_toregion(name, &r); dns_name_toregion(name, &r);
length = r.length; length = r.length;
tmp = isc_mem_get(cctx->mctx, length); if (cctx->arena_off + length < DNS_COMPRESS_ARENA_SIZE) {
tmp = &cctx->arena[cctx->arena_off];
cctx->arena_off += length;
} else {
allocated = true;
tmp = isc_mem_get(cctx->mctx, length);
}
/* /*
* Copy name data to 'tmp' and make 'r' use 'tmp'. * Copy name data to 'tmp' and make 'r' use 'tmp'.
*/ */
@@ -448,7 +456,7 @@ dns_compress_add(dns_compress_t *cctx, const dns_name_t *name,
* 'node->r.base' becomes 'tmp' when start == 0. * 'node->r.base' becomes 'tmp' when start == 0.
* Record this by setting 0x8000 so it can be freed later. * Record this by setting 0x8000 so it can be freed later.
*/ */
if (start == 0) { if (start == 0 && allocated) {
toffset |= 0x8000; toffset |= 0x8000;
} }
node->offset = toffset; node->offset = toffset;
@@ -466,7 +474,11 @@ dns_compress_add(dns_compress_t *cctx, const dns_name_t *name,
} }
if (start == 0) { if (start == 0) {
isc_mem_put(cctx->mctx, tmp, length); if (!allocated) {
cctx->arena_off -= length;
} else {
isc_mem_put(cctx->mctx, tmp, length);
}
} }
} }

View File

@@ -51,7 +51,8 @@ ISC_LANG_BEGINDECLS
#define DNS_COMPRESS_TABLEBITS 6 #define DNS_COMPRESS_TABLEBITS 6
#define DNS_COMPRESS_TABLESIZE (1U << DNS_COMPRESS_TABLEBITS) #define DNS_COMPRESS_TABLESIZE (1U << DNS_COMPRESS_TABLEBITS)
#define DNS_COMPRESS_TABLEMASK (DNS_COMPRESS_TABLESIZE - 1) #define DNS_COMPRESS_TABLEMASK (DNS_COMPRESS_TABLESIZE - 1)
#define DNS_COMPRESS_INITIALNODES 16 #define DNS_COMPRESS_INITIALNODES 24
#define DNS_COMPRESS_ARENA_SIZE 640
typedef struct dns_compressnode dns_compressnode_t; typedef struct dns_compressnode dns_compressnode_t;
@@ -69,6 +70,9 @@ struct dns_compress {
int edns; /*%< Edns version or -1. */ int edns; /*%< Edns version or -1. */
/*% Global compression table. */ /*% Global compression table. */
dns_compressnode_t *table[DNS_COMPRESS_TABLESIZE]; dns_compressnode_t *table[DNS_COMPRESS_TABLESIZE];
/*% Preallocated arena for names. */
unsigned char arena[DNS_COMPRESS_ARENA_SIZE];
off_t arena_off;
/*% Preallocated nodes for the table. */ /*% Preallocated nodes for the table. */
dns_compressnode_t initialnodes[DNS_COMPRESS_INITIALNODES]; dns_compressnode_t initialnodes[DNS_COMPRESS_INITIALNODES];
uint16_t count; /*%< Number of nodes. */ uint16_t count; /*%< Number of nodes. */