diff options
author | Sergey Popovich <popovich_sergei@mail.ru> | 2013-11-07 12:56:15 +0200 |
---|---|---|
committer | Jozsef Kadlecsik <kadlec@blackhole.kfki.hu> | 2013-11-11 22:35:07 +0100 |
commit | fe2f6de44c48d98891454c5ddd64260f7d7ccb9f (patch) | |
tree | 8cdd11e7c8c7aba9e80e690be9f69065e194e589 /lib | |
parent | 2a2d4ed1c7fc50cec09b4b95013aebc9f28d205e (diff) |
ipset: Fix malformed output from list/save for ICMP types in port field.
Found with ipset 6.12.1, but upstream version is still affected.
Creating set of dimension three, adding elements to it and then
displaying gives following results:
-----------------------------------
# ipset create test-1 hash:ip,port,ip
# ipset add test-1 192.0.2.1,icmp:echo-request,192.0.2.1
# ipset add test-1 192.0.2.1,icmp:ttl-zero-during-reassembly,192.0.2.1
# ipset list test-1
Name: test-1
Type: hash:ip,port,ip
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16608
References: 0
Members:
192.0.2.1,icmp:ttl-zero-during-reass,192.0.2.1
192.0.2.1,icmp:echo-re,192.0.2.1
Same results with -output save|xml.
ipset_print_proto_port() from lib/print.c returns incorrect length
of printed string when ICMP/ICMPv6 specified in port field.
Signed-off-by: Sergey Popovich <popovich_sergei@mail.ru>
Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/print.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/lib/print.c b/lib/print.c index abdfd34..6988fdf 100644 --- a/lib/print.c +++ b/lib/print.c @@ -709,18 +709,20 @@ ipset_print_proto_port(char *buf, unsigned int len, case IPPROTO_UDPLITE: break; case IPPROTO_ICMP: - return ipset_print_icmp(buf + offset, len, data, + size = ipset_print_icmp(buf + offset, len, data, IPSET_OPT_PORT, env); + goto out; case IPPROTO_ICMPV6: - return ipset_print_icmpv6(buf + offset, len, data, + size = ipset_print_icmpv6(buf + offset, len, data, IPSET_OPT_PORT, env); + goto out; default: break; } } size = ipset_print_port(buf + offset, len, data, IPSET_OPT_PORT, env); +out: SNPRINTF_FAILURE(size, len, offset); - return offset; } |