summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>2011-01-18 17:20:30 +0100
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>2011-01-18 17:20:30 +0100
commit321ed946b892bcc6ce069553418c1b706912e8df (patch)
treedc6fc1b76d1c0ee72056d7cc4fd48b6232e15bfc /lib
parentcac607bd8850e00356e4d97b05e7c8adfb3fa640 (diff)
Make IPv4 and IPv6 address handling similar
While the following works for AF_INET: ipset add foo 192.168.1.1/32 this does not work for AF_INET6: ipset add foo6 20a1:1:2:3:4:5:6:7/128 ipset v5.2: Syntax error: plain IP address must be supplied: 20a1:1:2:3:4:5:6:7/128 Bug reported by Holger Eitzenberger. The complete fix is to handle the special host prefixes in the general IP address parser function.
Diffstat (limited to 'lib')
-rw-r--r--lib/parse.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/parse.c b/lib/parse.c
index c4d9c75..fbc1dca 100644
--- a/lib/parse.c
+++ b/lib/parse.c
@@ -711,6 +711,14 @@ enum ipaddr_type {
IPADDR_RANGE,
};
+static inline bool
+cidr_hostaddr(const char *str, uint8_t family)
+{
+ char *a = cidr_separator(str);
+
+ return family == AF_INET ? STREQ(a, "/32") : STREQ(a, "/128");
+}
+
static int
parse_ip(struct ipset_session *session,
enum ipset_opt opt, const char *str, enum ipaddr_type addrtype)
@@ -725,7 +733,8 @@ parse_ip(struct ipset_session *session,
switch (addrtype) {
case IPADDR_PLAIN:
- if (range_separator(str) || cidr_separator(str))
+ if (range_separator(str)
+ || (cidr_separator(str) && !cidr_hostaddr(str, family)))
return syntax_err("plain IP address must be supplied: %s",
str);
break;