From: Alan T. DeKok Date: Wed, 13 Oct 2021 14:53:24 +0000 (-0400) Subject: just make them thread-local X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ac53d3a2ab7b1e8af47237803e1d02ac383648d0;p=thirdparty%2Ffreeradius-server.git just make them thread-local if the atexit stuff crashes, then we don't use it --- diff --git a/src/lib/util/dns.h b/src/lib/util/dns.h index 0bc2e25cfc6..3cffad115be 100644 --- a/src/lib/util/dns.h +++ b/src/lib/util/dns.h @@ -38,7 +38,7 @@ typedef struct { uint8_t *mark; //!< markup buffer int num; //!< number of used labels int max; //! maximum number of labels - fr_dns_block_t blocks[]; //!< array holding "max" labels + fr_dns_block_t *blocks; //!< array holding "max" labels } fr_dns_labels_t; ssize_t fr_dns_label_from_value_box(size_t *need, uint8_t *buf, size_t buflen, uint8_t *where, bool compression, fr_value_box_t const *value, fr_dns_labels_t *lb); diff --git a/src/protocols/dns/base.c b/src/protocols/dns/base.c index c74de31dd7a..8c1f1b585ac 100644 --- a/src/protocols/dns/base.c +++ b/src/protocols/dns/base.c @@ -39,7 +39,9 @@ typedef struct { fr_dict_t const *dict_dns; -static _Thread_local fr_dns_labels_t *fr_dns_labels; +static _Thread_local fr_dns_labels_t fr_dns_labels; +static _Thread_local fr_dns_block_t fr_dns_blocks[256]; +static _Thread_local uint8_t fr_dns_marker[65536]; extern fr_dict_autoload_t dns_dict[]; fr_dict_autoload_t dns_dict[] = { @@ -148,33 +150,14 @@ size_t fr_dns_value_len(fr_pair_t const *vp) } } -/** Cleanup the memory pool used by vlog_request - * - */ -static void _dns_labels_free(void *arg) -{ - talloc_free(arg); - fr_dns_labels = NULL; -} fr_dns_labels_t *fr_dns_labels_get(uint8_t const *packet, size_t packet_len, bool init_mark) { - fr_dns_labels_t *lb = fr_dns_labels; - - if (!lb) { - lb = (fr_dns_labels_t *) talloc_zero_array(NULL, uint8_t, sizeof(*lb) + sizeof(lb->blocks[0]) * 256); - if (!lb) return NULL; + fr_dns_labels_t *lb = &fr_dns_labels; - lb->max = 256; - - lb->mark = talloc_array(lb, uint8_t, 65536); - if (!lb->mark) { - talloc_free(lb); - return NULL; - } - - fr_atexit_thread_local(fr_dns_labels, _dns_labels_free, lb); - } + lb->max = 256; + lb->mark = fr_dns_marker; + lb->blocks = fr_dns_blocks; lb->start = packet; lb->end = packet + packet_len;