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.
This commit is contained in:
Christopher Faulet 2020-01-24 18:08:42 +01:00
parent 637259e044
commit a4168434a7
2 changed files with 10 additions and 6 deletions

View File

@ -115,7 +115,7 @@ struct act_rule {
char *varname; char *varname;
char *resolvers_id; char *resolvers_id;
struct dns_resolvers *resolvers; struct dns_resolvers *resolvers;
struct dns_options dns_opts; struct dns_options *dns_opts;
} dns; /* dns resolution */ } dns; /* dns resolution */
struct { struct {
int i; /* integer param (status, nice, loglevel, ..) */ int i; /* integer param (status, nice, loglevel, ..) */

View File

@ -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 = &stream->dns_ctx.hostname_dn;
hostname_dn_len = stream->dns_ctx.hostname_dn_len; hostname_dn_len = stream->dns_ctx.hostname_dn_len;
resolvers = stream->dns_ctx.parent->arg.dns.resolvers; 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_A
: DNS_RTYPE_AAAA); : DNS_RTYPE_AAAA);
break; break;
@ -2415,7 +2415,7 @@ enum act_return dns_action_do_resolve(struct act_rule *rule, struct proxy *px,
short ip_sin_family = 0; short ip_sin_family = 0;
void *ip = NULL; 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); 0, &ip, &ip_sin_family, NULL);
switch (ip_sin_family) { 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; 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 */ /* 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: /* optional arguments accepted for now:
* ipv4 or ipv6 * 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; goto do_resolve_parse_error;
if (strncmp(beg, "ipv4", end - beg) == 0) { 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) { 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 { else {
goto do_resolve_parse_error; goto do_resolve_parse_error;