From: Christopher Faulet Date: Fri, 24 Jan 2020 17:08:42 +0000 (+0100) Subject: MINOR: dns: Dynamically allocate dns options to reduce the act_rule size X-Git-Tag: v2.2-dev2~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4168434a72d22cb109c55a783c1133d2f73b81f;p=thirdparty%2Fhaproxy.git MINOR: dns: Dynamically allocate dns options to reduce the act_rule size <.arg.dns.dns_opts> field in the act_rule structure is now dynamically allocated when a do-resolve rule is parsed. This drastically reduces the structure size. --- diff --git a/include/types/action.h b/include/types/action.h index 6ec3f018d0..293e1d87f0 100644 --- a/include/types/action.h +++ b/include/types/action.h @@ -115,7 +115,7 @@ struct act_rule { char *varname; char *resolvers_id; struct dns_resolvers *resolvers; - struct dns_options dns_opts; + struct dns_options *dns_opts; } dns; /* dns resolution */ struct { int i; /* integer param (status, nice, loglevel, ..) */ diff --git a/src/dns.c b/src/dns.c index 28d47d26c5..bd2c9638ea 100644 --- a/src/dns.c +++ b/src/dns.c @@ -1629,7 +1629,7 @@ int dns_link_resolution(void *requester, int requester_type, int requester_locke hostname_dn = &stream->dns_ctx.hostname_dn; hostname_dn_len = stream->dns_ctx.hostname_dn_len; resolvers = stream->dns_ctx.parent->arg.dns.resolvers; - query_type = ((stream->dns_ctx.parent->arg.dns.dns_opts.family_prio == AF_INET) + query_type = ((stream->dns_ctx.parent->arg.dns.dns_opts->family_prio == AF_INET) ? DNS_RTYPE_A : DNS_RTYPE_AAAA); break; @@ -2415,7 +2415,7 @@ enum act_return dns_action_do_resolve(struct act_rule *rule, struct proxy *px, short ip_sin_family = 0; void *ip = NULL; - dns_get_ip_from_response(&resolution->response, &rule->arg.dns.dns_opts, NULL, + dns_get_ip_from_response(&resolution->response, rule->arg.dns.dns_opts, NULL, 0, &ip, &ip_sin_family, NULL); switch (ip_sin_family) { @@ -2533,8 +2533,12 @@ enum act_parse_ret dns_parse_do_resolve(const char **args, int *orig_arg, struct goto do_resolve_parse_error; + rule->arg.dns.dns_opts = calloc(1, sizeof(*rule->arg.dns.dns_opts)); + if (rule->arg.dns.dns_opts == NULL) + goto do_resolve_parse_error; + /* Default priority is ipv6 */ - rule->arg.dns.dns_opts.family_prio = AF_INET6; + rule->arg.dns.dns_opts->family_prio = AF_INET6; /* optional arguments accepted for now: * ipv4 or ipv6 @@ -2548,10 +2552,10 @@ enum act_parse_ret dns_parse_do_resolve(const char **args, int *orig_arg, struct goto do_resolve_parse_error; if (strncmp(beg, "ipv4", end - beg) == 0) { - rule->arg.dns.dns_opts.family_prio = AF_INET; + rule->arg.dns.dns_opts->family_prio = AF_INET; } else if (strncmp(beg, "ipv6", end - beg) == 0) { - rule->arg.dns.dns_opts.family_prio = AF_INET6; + rule->arg.dns.dns_opts->family_prio = AF_INET6; } else { goto do_resolve_parse_error;