summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2022-11-07 23:14:30 +0000
committerSimon Kelley <simon@thekelleys.org.uk>2022-11-07 23:14:30 +0000
commit262dadf50ed3688c6168680d22a6abf92a9e3ffa (patch)
tree7e4d0504ab9b3ad31881477ff2abe6f7f092326e
parent6c596f1cc1d92b2b90ef5ce043ace314eefa868b (diff)
downloaddnsmasq-262dadf50ed3688c6168680d22a6abf92a9e3ffa.tar.gz
Fix --server with multiple domains.
-rw-r--r--src/option.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/src/option.c b/src/option.c
index d067a16..4263dd6 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2957,7 +2957,7 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
case LOPT_LOCAL: /* --local */
case 'A': /* --address */
{
- char *lastdomain = NULL, *domain = "";
+ char *lastdomain = NULL, *domain = "", *cur_domain;
u16 flags = 0;
char *err;
union all_addr addr;
@@ -3008,9 +3008,12 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
if (servers_only && option == 'S')
flags |= SERV_FROM_FILE;
-
+
+ cur_domain = domain;
while ((flags & SERV_LITERAL_ADDRESS) || parse_server_next(&sdetails))
{
+ cur_domain = domain;
+
if (!(flags & SERV_LITERAL_ADDRESS) && (err = parse_server_addr(&sdetails)))
ret_err(err);
@@ -3022,24 +3025,24 @@ static int one_opt(int option, char *arg, char *errstr, char *gen_err, int comma
{
/* server=//1.2.3.4 is special. */
if (lastdomain)
- {
- if (strlen(domain) == 0)
- flags |= SERV_FOR_NODOTS;
- else
- flags &= ~SERV_FOR_NODOTS;
-
- /* address=/#/ matches the same as without domain */
- if (option == 'A' && domain[0] == '#' && domain[1] == 0)
- domain[0] = 0;
- }
-
- if (!add_update_server(flags, sdetails.addr, sdetails.source_addr, sdetails.interface, domain, &addr))
+ {
+ if (strlen(cur_domain) == 0)
+ flags |= SERV_FOR_NODOTS;
+ else
+ flags &= ~SERV_FOR_NODOTS;
+
+ /* address=/#/ matches the same as without domain */
+ if (option == 'A' && cur_domain[0] == '#' && cur_domain[1] == 0)
+ cur_domain[0] = 0;
+ }
+
+ if (!add_update_server(flags, sdetails.addr, sdetails.source_addr, sdetails.interface, cur_domain, &addr))
ret_err(gen_err);
-
- if (!lastdomain || domain == lastdomain)
+
+ if (!lastdomain || cur_domain == lastdomain)
break;
- domain += strlen(domain) + 1;
+ cur_domain += strlen(cur_domain) + 1;
}
if (flags & SERV_LITERAL_ADDRESS)