dnsmasq: fix ipv6 ipset bug
[oweals/openwrt.git] / package / network / services / dnsmasq / patches / 0007-Do-not-rely-on-dead-code-elimination-use-array-inste.patch
1 From 24b87607c1353e94689e8a2190571ab3f3b36f31 Mon Sep 17 00:00:00 2001
2 From: =?UTF-8?q?Petr=20Men=C5=A1=C3=ADk?= <pemensik@redhat.com>
3 Date: Wed, 24 Oct 2018 22:30:18 +0100
4 Subject: [PATCH 07/11] Do not rely on dead code elimination, use array
5  instead. Make options bits derived from size and count. Use size of option
6  bits and last supported bit in computation. No new change would be required
7  when new options are added. Just change OPT_LAST constant.
8
9 Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
10 ---
11  src/dnsmasq.h | 11 +++++++----
12  src/option.c  | 10 ++--------
13  2 files changed, 9 insertions(+), 12 deletions(-)
14
15 --- a/src/dnsmasq.h
16 +++ b/src/dnsmasq.h
17 @@ -200,9 +200,6 @@ struct event_desc {
18  #define EC_MISC        5
19  #define EC_INIT_OFFSET 10
20  
21 -/* Trust the compiler dead-code eliminator.... */
22 -#define option_bool(x) (((x) < 32) ? daemon->options & (1u << (x)) : daemon->options2 & (1u << ((x) - 32)))
23 -
24  #define OPT_BOGUSPRIV      0
25  #define OPT_FILTER         1
26  #define OPT_LOG            2
27 @@ -264,6 +261,12 @@ struct event_desc {
28  #define OPT_UBUS           58
29  #define OPT_LAST           59
30  
31 +#define OPTION_BITS (sizeof(unsigned int)*8)
32 +#define OPTION_SIZE ( (OPT_LAST/OPTION_BITS)+((OPT_LAST%OPTION_BITS)!=0) )
33 +#define option_var(x) (daemon->options[(x) / OPTION_BITS])
34 +#define option_val(x) ((1u) << ((x) % OPTION_BITS))
35 +#define option_bool(x) (option_var(x) & option_val(x))
36 +
37  /* extra flags for my_syslog, we use a couple of facilities since they are known 
38     not to occupy the same bits as priorities, no matter how syslog.h is set up. */
39  #define MS_TFTP   LOG_USER
40 @@ -978,7 +981,7 @@ extern struct daemon {
41       config file arguments. All set (including defaults)
42       in option.c */
43  
44 -  unsigned int options, options2;
45 +  unsigned int options[OPTION_SIZE];
46    struct resolvc default_resolv, *resolv_files;
47    time_t last_resolv;
48    char *servers_file;
49 --- a/src/option.c
50 +++ b/src/option.c
51 @@ -1490,18 +1490,12 @@ static int parse_dhcp_opt(char *errstr,
52  
53  void set_option_bool(unsigned int opt)
54  {
55 -  if (opt < 32)
56 -    daemon->options |= 1u << opt;
57 -  else
58 -    daemon->options2 |= 1u << (opt - 32);
59 +  option_var(opt) |= option_val(opt);
60  }
61  
62  void reset_option_bool(unsigned int opt)
63  {
64 -  if (opt < 32)
65 -    daemon->options &= ~(1u << opt);
66 -  else
67 -    daemon->options2 &= ~(1u << (opt - 32));
68 +  option_var(opt) &= ~(option_val(opt));
69  }
70  
71  static int one_opt(int option, char *arg, char *errstr, char *gen_err, int command_line, int servers_only)