summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Derigs <dl6er@dl6er.de>2021-09-30 11:03:05 +0200
committerSimon Kelley <simon@thekelleys.org.uk>2021-09-30 11:52:24 +0100
commited4e7defd7d231e2e424aed0b160603f6e627aba (patch)
tree6d898cef4ea52b9b3f245f8a80439f04a1da3048
parent267ab619c419a6f6564bea4a01ec4f1c80bcb7c9 (diff)
downloaddnsmasq-ed4e7defd7d231e2e424aed0b160603f6e627aba.tar.gz
Do not fail hard when rev-server has a non-zero final address partv2.87test3
Signed-off-by: DL6ER <dl6er@dl6er.de>
-rw-r--r--src/option.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/src/option.c b/src/option.c
index 4e533be..5307f01 100644
--- a/src/option.c
+++ b/src/option.c
@@ -963,13 +963,9 @@ static char *domain_rev4(int from_file, char *server, struct in_addr *addr4, int
if (size > 32 || size < 1)
return _("bad IPv4 prefix length");
-
- for (i = 0; i < addrbytes; i++)
- if (((u8 *)addr4)[3-i] != 0)
- break;
-
- if (i != addrbytes || (((u8 *)addr4)[3-addrbytes] & ((1 << addrbits) - 1)) != 0)
- return _("address part not zero");
+
+ /* Zero out last address bits according to CIDR mask */
+ ((u8 *)addr4)[3-addrbytes] &= ~((1 << addrbits)-1);
size = size & ~0x7;
@@ -1026,13 +1022,9 @@ static char *domain_rev6(int from_file, char *server, struct in6_addr *addr6, in
if (size > 128 || size < 1)
return _("bad IPv6 prefix length");
-
- for (i = 0; i < addrbytes; i++)
- if (addr6->s6_addr[15-i] != 0)
- break;
- if (i != addrbytes || (addr6->s6_addr[15-addrbytes] & ((1 << addrbits) - 1)) != 0)
- return _("address part not zero");
+ /* Zero out last address bits according to CIDR mask */
+ addr6->s6_addr[15-addrbytes] &= ~((1 << addrbits) - 1);
size = size & ~0x3;