diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2014-07-03 10:52:48 +0200 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2014-07-03 11:01:15 +0200 |
commit | 7db01c8b2fda897c596ee7befbead66c31285590 (patch) | |
tree | 63ce3acd53d917c84aef04ce69782e3d00d36dfd /options.c | |
parent | 94e7253a1166c1a03061c12e7e469433111f8f6f (diff) | |
download | firewall3-7db01c8b2fda897c596ee7befbead66c31285590.tar.gz |
options: fix fw3_parse_network() when destination pointer is not a list
Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
Diffstat (limited to 'options.c')
-rw-r--r-- | options.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -329,7 +329,7 @@ bool fw3_parse_network(void *ptr, const char *val, bool is_list) { struct fw3_device dev = { }; - struct fw3_address *addr; + struct fw3_address *addr, *tmp; LIST_HEAD(addr_list); if (!fw3_parse_address(ptr, val, is_list)) @@ -343,7 +343,19 @@ fw3_parse_network(void *ptr, const char *val, bool is_list) addr->invert = dev.invert; addr->resolved = true; } - list_splice_tail(&addr_list, ptr); + + if (is_list) + { + list_splice_tail(&addr_list, ptr); + } + else if (!list_empty(&addr_list)) + { + memcpy(ptr, list_first_entry(&addr_list, typeof(*addr), list), + sizeof(*addr)); + + list_for_each_entry_safe(addr, tmp, &addr_list, list) + free(addr); + } } return true; |