diff options
author | Simon Kelley <simon@thekelleys.org.uk> | 2021-11-28 18:39:42 +0000 |
---|---|---|
committer | Simon Kelley <simon@thekelleys.org.uk> | 2021-11-28 18:39:42 +0000 |
commit | e3093b532c34a8d95c8c751bdd9cabf552f5bf05 (patch) | |
tree | d311983b820acac7be49f7eec4dd6d572ea05854 | |
parent | 9560658c5ba27a370b97d30850db474ce67912b7 (diff) | |
download | dnsmasq-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.h | 1 | ||||
-rw-r--r-- | src/domain-match.c | 2 | ||||
-rw-r--r-- | src/forward.c | 2 | ||||
-rw-r--r-- | src/util.c | 16 |
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; @@ -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 */ |