mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-03 08:05:21 +00:00
4376. [experimental] Added support for Catalog Zones, a new method for
provisioning secondary servers in which a list of zones to be served is stored in a DNS zone and can be propagated to slaves via AXFR/IXFR. [RT #41581] 4375. [func] Add support for automatic reallocation of isc_buffer to isc_buffer_put* functions. [RT #42394]
This commit is contained in:
@@ -60,6 +60,7 @@ isc_buffer_reinit(isc_buffer_t *b, void *base, unsigned int length) {
|
||||
*/
|
||||
REQUIRE(b->length <= length);
|
||||
REQUIRE(base != NULL);
|
||||
REQUIRE(b->autore = ISC_FALSE);
|
||||
|
||||
(void)memmove(base, b->base, b->length);
|
||||
b->base = base;
|
||||
@@ -79,6 +80,13 @@ isc__buffer_invalidate(isc_buffer_t *b) {
|
||||
ISC__BUFFER_INVALIDATE(b);
|
||||
}
|
||||
|
||||
void
|
||||
isc_buffer_setautorealloc(isc_buffer_t *b, isc_boolean_t enable) {
|
||||
REQUIRE(ISC_BUFFER_VALID(b));
|
||||
REQUIRE(b->mctx != NULL);
|
||||
b->autore = enable;
|
||||
}
|
||||
|
||||
void
|
||||
isc__buffer_region(isc_buffer_t *b, isc_region_t *r) {
|
||||
/*
|
||||
@@ -279,8 +287,13 @@ isc_buffer_getuint8(isc_buffer_t *b) {
|
||||
|
||||
void
|
||||
isc__buffer_putuint8(isc_buffer_t *b, isc_uint8_t val) {
|
||||
isc_result_t result;
|
||||
REQUIRE(ISC_BUFFER_VALID(b));
|
||||
REQUIRE(b->used + 1 <= b->length);
|
||||
if (b->autore) {
|
||||
result = isc_buffer_reserve(&b, 1);
|
||||
REQUIRE(result == ISC_R_SUCCESS);
|
||||
}
|
||||
REQUIRE(isc_buffer_availablelength(b) >= 1);
|
||||
|
||||
ISC__BUFFER_PUTUINT8(b, val);
|
||||
}
|
||||
@@ -308,16 +321,26 @@ isc_buffer_getuint16(isc_buffer_t *b) {
|
||||
|
||||
void
|
||||
isc__buffer_putuint16(isc_buffer_t *b, isc_uint16_t val) {
|
||||
isc_result_t result;
|
||||
REQUIRE(ISC_BUFFER_VALID(b));
|
||||
REQUIRE(b->used + 2 <= b->length);
|
||||
if (b->autore) {
|
||||
result = isc_buffer_reserve(&b, 2);
|
||||
REQUIRE(result == ISC_R_SUCCESS);
|
||||
}
|
||||
REQUIRE(isc_buffer_availablelength(b) >= 2);
|
||||
|
||||
ISC__BUFFER_PUTUINT16(b, val);
|
||||
}
|
||||
|
||||
void
|
||||
isc__buffer_putuint24(isc_buffer_t *b, isc_uint32_t val) {
|
||||
isc_result_t result;
|
||||
REQUIRE(ISC_BUFFER_VALID(b));
|
||||
REQUIRE(b->used + 3 <= b->length);
|
||||
if (b->autore) {
|
||||
result = isc_buffer_reserve(&b, 3);
|
||||
REQUIRE(result == ISC_R_SUCCESS);
|
||||
}
|
||||
REQUIRE(isc_buffer_availablelength(b) >= 3);
|
||||
|
||||
ISC__BUFFER_PUTUINT24(b, val);
|
||||
}
|
||||
@@ -347,8 +370,13 @@ isc_buffer_getuint32(isc_buffer_t *b) {
|
||||
|
||||
void
|
||||
isc__buffer_putuint32(isc_buffer_t *b, isc_uint32_t val) {
|
||||
isc_result_t result;
|
||||
REQUIRE(ISC_BUFFER_VALID(b));
|
||||
REQUIRE(b->used + 4 <= b->length);
|
||||
if (b->autore == ISC_TRUE) {
|
||||
result = isc_buffer_reserve(&b, 4);
|
||||
REQUIRE(result == ISC_R_SUCCESS);
|
||||
}
|
||||
REQUIRE(isc_buffer_availablelength(b) >= 4);
|
||||
|
||||
ISC__BUFFER_PUTUINT32(b, val);
|
||||
}
|
||||
@@ -380,11 +408,16 @@ isc_buffer_getuint48(isc_buffer_t *b) {
|
||||
|
||||
void
|
||||
isc__buffer_putuint48(isc_buffer_t *b, isc_uint64_t val) {
|
||||
isc_result_t result;
|
||||
isc_uint16_t valhi;
|
||||
isc_uint32_t vallo;
|
||||
|
||||
REQUIRE(ISC_BUFFER_VALID(b));
|
||||
REQUIRE(b->used + 6 <= b->length);
|
||||
if (b->autore == ISC_TRUE) {
|
||||
result = isc_buffer_reserve(&b, 6);
|
||||
REQUIRE(result == ISC_R_SUCCESS);
|
||||
}
|
||||
REQUIRE(isc_buffer_availablelength(b) >= 6);
|
||||
|
||||
valhi = (isc_uint16_t)(val >> 32);
|
||||
vallo = (isc_uint32_t)(val & 0xFFFFFFFF);
|
||||
@@ -396,8 +429,13 @@ void
|
||||
isc__buffer_putmem(isc_buffer_t *b, const unsigned char *base,
|
||||
unsigned int length)
|
||||
{
|
||||
isc_result_t result;
|
||||
REQUIRE(ISC_BUFFER_VALID(b));
|
||||
REQUIRE(b->used + length <= b->length);
|
||||
if (b->autore == ISC_TRUE) {
|
||||
result = isc_buffer_reserve(&b, length);
|
||||
REQUIRE(result == ISC_R_SUCCESS);
|
||||
}
|
||||
REQUIRE(isc_buffer_availablelength(b) >= length);
|
||||
|
||||
ISC__BUFFER_PUTMEM(b, base, length);
|
||||
}
|
||||
@@ -406,6 +444,7 @@ void
|
||||
isc__buffer_putstr(isc_buffer_t *b, const char *source) {
|
||||
unsigned int l;
|
||||
unsigned char *cp;
|
||||
isc_result_t result;
|
||||
|
||||
REQUIRE(ISC_BUFFER_VALID(b));
|
||||
REQUIRE(source != NULL);
|
||||
@@ -414,8 +453,11 @@ isc__buffer_putstr(isc_buffer_t *b, const char *source) {
|
||||
* Do not use ISC__BUFFER_PUTSTR(), so strlen is only done once.
|
||||
*/
|
||||
l = strlen(source);
|
||||
|
||||
REQUIRE(l <= isc_buffer_availablelength(b));
|
||||
if (b->autore == ISC_TRUE) {
|
||||
result = isc_buffer_reserve(&b, l);
|
||||
REQUIRE(result == ISC_R_SUCCESS);
|
||||
}
|
||||
REQUIRE(isc_buffer_availablelength(b) >= l);
|
||||
|
||||
cp = isc_buffer_used(b);
|
||||
memmove(cp, source, l);
|
||||
@@ -448,16 +490,21 @@ isc_buffer_allocate(isc_mem_t *mctx, isc_buffer_t **dynbuffer,
|
||||
unsigned int length)
|
||||
{
|
||||
isc_buffer_t *dbuf;
|
||||
|
||||
unsigned char * bdata;
|
||||
REQUIRE(dynbuffer != NULL);
|
||||
REQUIRE(*dynbuffer == NULL);
|
||||
|
||||
dbuf = isc_mem_get(mctx, length + sizeof(isc_buffer_t));
|
||||
dbuf = isc_mem_get(mctx, sizeof(isc_buffer_t));
|
||||
if (dbuf == NULL)
|
||||
return (ISC_R_NOMEMORY);
|
||||
|
||||
isc_buffer_init(dbuf, ((unsigned char *)dbuf) + sizeof(isc_buffer_t),
|
||||
length);
|
||||
bdata = isc_mem_get(mctx, length);
|
||||
if (bdata == NULL) {
|
||||
isc_mem_put(mctx, dbuf, sizeof(isc_buffer_t));
|
||||
return (ISC_R_NOMEMORY);
|
||||
}
|
||||
|
||||
isc_buffer_init(dbuf, bdata, length);
|
||||
dbuf->mctx = mctx;
|
||||
|
||||
ENSURE(ISC_BUFFER_VALID(dbuf));
|
||||
@@ -469,7 +516,7 @@ isc_buffer_allocate(isc_mem_t *mctx, isc_buffer_t **dynbuffer,
|
||||
|
||||
isc_result_t
|
||||
isc_buffer_reallocate(isc_buffer_t **dynbuffer, unsigned int length) {
|
||||
isc_buffer_t *dbuf;
|
||||
unsigned char *bdata;
|
||||
|
||||
REQUIRE(dynbuffer != NULL);
|
||||
REQUIRE(ISC_BUFFER_VALID(*dynbuffer));
|
||||
@@ -483,18 +530,16 @@ isc_buffer_reallocate(isc_buffer_t **dynbuffer, unsigned int length) {
|
||||
* it doesn't remap pages, but does ordinary copy. So is
|
||||
* isc_mem_reallocate(), which has additional issues.
|
||||
*/
|
||||
dbuf = isc_mem_get((*dynbuffer)->mctx, length + sizeof(isc_buffer_t));
|
||||
if (dbuf == NULL)
|
||||
bdata = isc_mem_get((*dynbuffer)->mctx, length);
|
||||
if (bdata == NULL)
|
||||
return (ISC_R_NOMEMORY);
|
||||
|
||||
memmove(dbuf, *dynbuffer, (*dynbuffer)->length + sizeof(isc_buffer_t));
|
||||
isc_mem_put(dbuf->mctx, *dynbuffer,
|
||||
(*dynbuffer)->length + sizeof(isc_buffer_t));
|
||||
memmove(bdata, (*dynbuffer)->base, (*dynbuffer)->length);
|
||||
isc_mem_put((*dynbuffer)->mctx, (*dynbuffer)->base,
|
||||
(*dynbuffer)->length);
|
||||
|
||||
dbuf->base = ((unsigned char *)dbuf) + sizeof(isc_buffer_t);
|
||||
dbuf->length = length;
|
||||
|
||||
*dynbuffer = dbuf;
|
||||
(*dynbuffer)->base = bdata;
|
||||
(*dynbuffer)->length = length;
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
}
|
||||
@@ -530,7 +575,6 @@ isc_buffer_reserve(isc_buffer_t **dynbuffer, unsigned int size) {
|
||||
|
||||
void
|
||||
isc_buffer_free(isc_buffer_t **dynbuffer) {
|
||||
unsigned int real_length;
|
||||
isc_buffer_t *dbuf;
|
||||
isc_mem_t *mctx;
|
||||
|
||||
@@ -540,11 +584,10 @@ isc_buffer_free(isc_buffer_t **dynbuffer) {
|
||||
|
||||
dbuf = *dynbuffer;
|
||||
*dynbuffer = NULL; /* destroy external reference */
|
||||
|
||||
real_length = dbuf->length + sizeof(isc_buffer_t);
|
||||
mctx = dbuf->mctx;
|
||||
dbuf->mctx = NULL;
|
||||
isc_buffer_invalidate(dbuf);
|
||||
|
||||
isc_mem_put(mctx, dbuf, real_length);
|
||||
isc_mem_put(mctx, dbuf->base, dbuf->length);
|
||||
isc_buffer_invalidate(dbuf);
|
||||
isc_mem_put(mctx, dbuf, sizeof(isc_buffer_t));
|
||||
}
|
||||
|
Reference in New Issue
Block a user