2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 14:07:59 +00:00

additional code cleanups in httpd.c

- use isc_buffer functions when appropriate, rather than converting
  to and from isc_region unnecessarily
- use the zlib total_out value instead of calculating it
- use c99 struct initialization
This commit is contained in:
Evan Hunt 2022-08-16 16:26:02 -07:00
parent 7f4889e159
commit 4b7248545e

View File

@ -823,7 +823,7 @@ render_500(const char *url, isc_httpdurl_t *urlinfo, const char *querystring,
#ifdef HAVE_ZLIB #ifdef HAVE_ZLIB
/*%< /*%<
* Reallocates compbuffer to size, does nothing if compbuffer is already * Reallocates compbuffer to size; does nothing if compbuffer is already
* larger than size. * larger than size.
*/ */
static void static void
@ -831,11 +831,11 @@ alloc_compspace(isc_httpd_t *httpd, unsigned int size) {
char *newspace = NULL; char *newspace = NULL;
isc_region_t r; isc_region_t r;
isc_buffer_region(&httpd->compbuffer, &r); if (size <= isc_buffer_length(&httpd->compbuffer)) {
if (size < r.length) {
return; return;
} }
isc_buffer_region(&httpd->compbuffer, &r);
newspace = isc_mem_get(httpd->mgr->mctx, size); newspace = isc_mem_get(httpd->mgr->mctx, size);
isc_buffer_reinit(&httpd->compbuffer, newspace, size); isc_buffer_reinit(&httpd->compbuffer, newspace, size);
@ -860,25 +860,23 @@ alloc_compspace(isc_httpd_t *httpd, unsigned int size) {
static isc_result_t static isc_result_t
httpd_compress(isc_httpd_t *httpd) { httpd_compress(isc_httpd_t *httpd) {
z_stream zstr; z_stream zstr;
isc_region_t r; int ret, inputlen;
int ret;
int inputlen;
inputlen = isc_buffer_usedlength(&httpd->bodybuffer);
alloc_compspace(httpd, inputlen);
isc_buffer_clear(&httpd->compbuffer);
isc_buffer_region(&httpd->compbuffer, &r);
/* /*
* We're setting output buffer size to input size so it fails if the * We're setting output buffer size to input size so it fails if the
* compressed data size would be bigger than the input size. * compressed data size would be bigger than the input size.
*/ */
memset(&zstr, 0, sizeof(zstr)); inputlen = isc_buffer_usedlength(&httpd->bodybuffer);
zstr.total_in = zstr.avail_in = zstr.total_out = zstr.avail_out = alloc_compspace(httpd, inputlen);
inputlen; isc_buffer_clear(&httpd->compbuffer);
zstr.next_in = isc_buffer_base(&httpd->bodybuffer); zstr = (z_stream){
zstr.next_out = r.base; .total_in = inputlen,
.avail_out = inputlen,
.avail_in = inputlen,
.next_in = isc_buffer_base(&httpd->bodybuffer),
.next_out = isc_buffer_base(&httpd->compbuffer),
};
ret = deflateInit(&zstr, Z_DEFAULT_COMPRESSION); ret = deflateInit(&zstr, Z_DEFAULT_COMPRESSION);
if (ret == Z_OK) { if (ret == Z_OK) {
@ -886,7 +884,7 @@ httpd_compress(isc_httpd_t *httpd) {
} }
deflateEnd(&zstr); deflateEnd(&zstr);
if (ret == Z_STREAM_END) { if (ret == Z_STREAM_END) {
isc_buffer_add(&httpd->compbuffer, inputlen - zstr.avail_out); isc_buffer_add(&httpd->compbuffer, zstr.total_out);
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);
} else { } else {
return (ISC_R_FAILURE); return (ISC_R_FAILURE);
@ -1025,9 +1023,8 @@ httpd_request(isc_nmhandle_t *handle, isc_result_t eresult,
isc_buffer_clear(&httpd->headerbuffer); isc_buffer_clear(&httpd->headerbuffer);
isc_buffer_setautorealloc(httpd->sendbuffer, true); isc_buffer_setautorealloc(httpd->sendbuffer, true);
databuffer = (is_compressed ? &httpd->compbuffer : &httpd->bodybuffer); databuffer = (is_compressed ? &httpd->compbuffer : &httpd->bodybuffer);
isc_buffer_usedregion(databuffer, &r); isc_buffer_putmem(httpd->sendbuffer, isc_buffer_base(databuffer),
result = isc_buffer_copyregion(httpd->sendbuffer, &r); isc_buffer_usedlength(databuffer));
RUNTIME_CHECK(result == ISC_R_SUCCESS);
/* Consume the request from the recv buffer. */ /* Consume the request from the recv buffer. */
if (httpd->consume != 0U) { if (httpd->consume != 0U) {
@ -1206,18 +1203,11 @@ httpd_senddone(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
REQUIRE(VALID_HTTPD(httpd)); REQUIRE(VALID_HTTPD(httpd));
REQUIRE(httpd->handle == handle); REQUIRE(httpd->handle == handle);
/* Clean up buffers */
isc_buffer_free(&httpd->sendbuffer); isc_buffer_free(&httpd->sendbuffer);
if (httpd->freecb != NULL && isc_buffer_length(&httpd->bodybuffer) > 0)
/* {
* We will always want to clean up our receive buffer, even if we httpd->freecb(&httpd->bodybuffer, httpd->freecb_arg);
* got an error on send or we are shutting down.
*/
if (httpd->freecb != NULL) {
isc_buffer_t *b = NULL;
if (isc_buffer_length(&httpd->bodybuffer) > 0) {
b = &httpd->bodybuffer;
httpd->freecb(b, httpd->freecb_arg);
}
} }
isc_nmhandle_detach(&httpd->sendhandle); isc_nmhandle_detach(&httpd->sendhandle);