summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Kelley <simon@thekelleys.org.uk>2021-11-28 18:39:42 +0000
committerSimon Kelley <simon@thekelleys.org.uk>2021-11-28 18:39:42 +0000
commite3093b532c34a8d95c8c751bdd9cabf552f5bf05 (patch)
treed311983b820acac7be49f7eec4dd6d572ea05854
parent9560658c5ba27a370b97d30850db474ce67912b7 (diff)
downloaddnsmasq-e3093b532c34a8d95c8c751bdd9cabf552f5bf05.tar.gz
Fix problems with upper-case in domain-match.
The domain-match rewrite didn't take into account that domain names are case-insensitive, so things like --address=/Example.com/..... didn't work correctly.
-rw-r--r--src/dnsmasq.h1
-rw-r--r--src/domain-match.c2
-rw-r--r--src/forward.c2
-rw-r--r--src/util.c16
4 files changed, 15 insertions, 6 deletions
diff --git a/src/dnsmasq.h b/src/dnsmasq.h
index bf7685d..05c1743 100644
--- a/src/dnsmasq.h
+++ b/src/dnsmasq.h
@@ -1376,6 +1376,7 @@ void safe_pipe(int *fd, int read_noblock);
void *whine_malloc(size_t size);
int sa_len(union mysockaddr *addr);
int sockaddr_isequal(const union mysockaddr *s1, const union mysockaddr *s2);
+int hostname_order(const char *a, const char *b);
int hostname_isequal(const char *a, const char *b);
int hostname_issubdomain(char *a, char *b);
time_t dnsmasq_time(void);
diff --git a/src/domain-match.c b/src/domain-match.c
index 6f59566..b457f5b 100644
--- a/src/domain-match.c
+++ b/src/domain-match.c
@@ -494,7 +494,7 @@ static int order(char *qdomain, size_t qlen, struct server *serv)
if (qlen > dlen)
return -1;
- return strcmp(qdomain, serv->domain);
+ return hostname_order(qdomain, serv->domain);
}
static int order_servers(struct server *s1, struct server *s2)
diff --git a/src/forward.c b/src/forward.c
index 04635b3..5c0173c 100644
--- a/src/forward.c
+++ b/src/forward.c
@@ -170,8 +170,8 @@ static int forward_query(int udpfd, union mysockaddr *udpaddr,
unsigned int fwd_flags = 0;
int is_dnssec = forward && (forward->flags & (FREC_DNSKEY_QUERY | FREC_DS_QUERY));
struct server *master;
- unsigned int gotname = extract_request(header, plen, daemon->namebuff, NULL);
void *hash = hash_questions(header, plen, daemon->namebuff);
+ unsigned int gotname = extract_request(header, plen, daemon->namebuff, NULL);
unsigned char *oph = find_pseudoheader(header, plen, NULL, NULL, NULL, NULL);
int old_src = 0, old_reply = 0;
int first, last, start = 0;
diff --git a/src/util.c b/src/util.c
index 7bef630..f2adac1 100644
--- a/src/util.c
+++ b/src/util.c
@@ -367,7 +367,7 @@ int sa_len(union mysockaddr *addr)
}
/* don't use strcasecmp and friends here - they may be messed up by LOCALE */
-int hostname_isequal(const char *a, const char *b)
+int hostname_order(const char *a, const char *b)
{
unsigned int c1, c2;
@@ -380,11 +380,19 @@ int hostname_isequal(const char *a, const char *b)
if (c2 >= 'A' && c2 <= 'Z')
c2 += 'a' - 'A';
- if (c1 != c2)
- return 0;
+ if (c1 < c2)
+ return -1;
+ else if (c1 > c2)
+ return 1;
+
} while (c1);
- return 1;
+ return 0;
+}
+
+int hostname_isequal(const char *a, const char *b)
+{
+ return hostname_order(a, b) == 0;
}
/* is b equal to or a subdomain of a return 2 for equal, 1 for subdomain */