]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
just make them thread-local
authorAlan T. DeKok <aland@freeradius.org>
Wed, 13 Oct 2021 14:53:24 +0000 (10:53 -0400)
committerAlan T. DeKok <aland@freeradius.org>
Wed, 13 Oct 2021 14:53:24 +0000 (10:53 -0400)
if the atexit stuff crashes, then we don't use it

src/lib/util/dns.h
src/protocols/dns/base.c

index 0bc2e25cfc627be20ebe77ce28aa0797a3bc5a83..3cffad115bea11458afb9828673fa35256fa3601 100644 (file)
@@ -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);
index c74de31dd7a235230494ecf095d48b87b978706b..8c1f1b585ac5b3de06873c310037388ec68b3780 100644 (file)
@@ -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;