dnsmasq: Backport some security updates
[librecmc/librecmc.git] / package / network / services / dnsmasq / patches / 0111-Small-cleanups-in-frec_src-datastucture-handling.patch
1 From 6a6e06fbb0d4690507ceaf2bb6f0d8910f3d4914 Mon Sep 17 00:00:00 2001
2 From: Simon Kelley <simon@thekelleys.org.uk>
3 Date: Fri, 4 Dec 2020 18:35:11 +0000
4 Subject: Small cleanups in frec_src datastucture handling.
5
6 ---
7  src/forward.c | 22 +++++++++++++---------
8  1 file changed, 13 insertions(+), 9 deletions(-)
9
10 --- a/src/forward.c
11 +++ b/src/forward.c
12 @@ -353,7 +353,10 @@ static int forward_query(int udpfd, unio
13           if (!daemon->free_frec_src &&
14               daemon->frec_src_count < daemon->ftabsize &&
15               (daemon->free_frec_src = whine_malloc(sizeof(struct frec_src))))
16 -           daemon->frec_src_count++;
17 +           {
18 +             daemon->frec_src_count++;
19 +             daemon->free_frec_src->next = NULL;
20 +           }
21           
22           /* If we've been spammed with many duplicates, just drop the query. */
23           if (daemon->free_frec_src)
24 @@ -390,6 +393,7 @@ static int forward_query(int udpfd, unio
25           forward->frec_src.orig_id = ntohs(header->id);
26           forward->frec_src.dest = *dst_addr;
27           forward->frec_src.iface = dst_iface;
28 +         forward->frec_src.next = NULL;
29           forward->new_id = get_id();
30           forward->fd = udpfd;
31           memcpy(forward->hash, hash, HASH_SIZE);
32 @@ -2226,16 +2230,16 @@ void free_rfd(struct randfd *rfd)
33  
34  static void free_frec(struct frec *f)
35  {
36 -  struct frec_src *src, *tmp;
37 -
38 -   /* add back to freelist of not the record builtin to every frec. */
39 -  for (src = f->frec_src.next; src; src = tmp)
40 +  struct frec_src *last;
41 +  
42 +  /* add back to freelist if not the record builtin to every frec. */
43 +  for (last = f->frec_src.next; last && last->next; last = last->next) ;
44 +  if (last)
45      {
46 -      tmp = src->next;
47 -      src->next = daemon->free_frec_src;
48 -      daemon->free_frec_src = src;
49 +      last->next = daemon->free_frec_src;
50 +      daemon->free_frec_src = f->frec_src.next;
51      }
52 -  
53 +    
54    f->frec_src.next = NULL;    
55    free_rfd(f->rfd4);
56    f->rfd4 = NULL;