From: Alan T. DeKok Date: Wed, 13 Oct 2021 13:23:54 +0000 (-0400) Subject: initialize as needed, not globally X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a985c2e80867562ba1df60f603ef5b1fccb7fb09;p=thirdparty%2Ffreeradius-server.git initialize as needed, not globally --- diff --git a/src/protocols/dns/base.c b/src/protocols/dns/base.c index ed629fe200d..c74de31dd7a 100644 --- a/src/protocols/dns/base.c +++ b/src/protocols/dns/base.c @@ -148,11 +148,33 @@ 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) return NULL; + if (!lb) { + lb = (fr_dns_labels_t *) talloc_zero_array(NULL, uint8_t, sizeof(*lb) + sizeof(lb->blocks[0]) * 256); + if (!lb) return NULL; + + 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->start = packet; lb->end = packet + packet_len; @@ -166,16 +188,6 @@ fr_dns_labels_t *fr_dns_labels_get(uint8_t const *packet, size_t packet_len, boo return lb; } -/** Cleanup the memory pool used by vlog_request - * - */ -static void _dns_labels_free(void *arg) -{ - talloc_free(arg); - fr_dns_labels = NULL; -} - - /** Resolve/cache attributes in the DNS dictionary * * @return @@ -184,8 +196,6 @@ static void _dns_labels_free(void *arg) */ int fr_dns_global_init(void) { - fr_dns_labels_t *lb; - if (instance_count > 0) { instance_count++; return 0; @@ -193,24 +203,10 @@ int fr_dns_global_init(void) if (fr_dict_autoload(dns_dict) < 0) return -1; if (fr_dict_attr_autoload(dns_dict_attr) < 0) { - fail: fr_dict_autofree(dns_dict); return -1; } - lb = (fr_dns_labels_t *) talloc_zero_array(NULL, uint8_t, sizeof(*lb) + sizeof(lb->blocks[0]) * 256); - if (!lb) goto fail; - - lb->max = 256; - - lb->mark = talloc_array(lb, uint8_t, 65536); - if (!lb->mark) { - talloc_free(lb); - goto fail; - } - - fr_atexit_thread_local(fr_dns_labels, _dns_labels_free, lb); - instance_count++; return 0;