diff options
author | Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | 2011-01-18 17:20:30 +0100 |
---|---|---|
committer | Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | 2011-01-18 17:20:30 +0100 |
commit | 321ed946b892bcc6ce069553418c1b706912e8df (patch) | |
tree | dc6fc1b76d1c0ee72056d7cc4fd48b6232e15bfc /lib/parse.c | |
parent | cac607bd8850e00356e4d97b05e7c8adfb3fa640 (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/parse.c')
-rw-r--r-- | lib/parse.c | 11 |
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; |