X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffirewall3.git;a=blobdiff_plain;f=iptables.c;h=2684933970ef26d08bbbeaafffbaaa5fe0cf9fb8;hp=4956ef70211ac9267ab6f7cf8e4098e3c7a18ba3;hb=30dd728d1d1303a10e03b6c0fae974e5acf08d6b;hpb=3833ad4b0a46778d718d5146ca567d23d0b23291 diff --git a/iptables.c b/iptables.c index 4956ef7..2684933 100644 --- a/iptables.c +++ b/iptables.c @@ -54,6 +54,19 @@ get_kernel_version(void) kernel_version = LINUX_VERSION(x, y, z); } +#undef __ipt_module +#define __ipt_module(x) libxt_##x##_init, libipt_##x##_init, libip6t_##x##_init, + +static void fw3_init_extensions(void) +{ + int i; + void (*initfuncs[])(void) = { FW3_IPT_MODULES }; + + for (i = 0; i < sizeof(initfuncs)/sizeof(initfuncs[0]); i++) + if (initfuncs[i]) + initfuncs[i](); +} + struct fw3_ipt_handle * fw3_ipt_open(enum fw3_family family, enum fw3_table table) { @@ -94,9 +107,7 @@ fw3_ipt_open(enum fw3_family family, enum fw3_table table) xtables_matches = NULL; xtables_targets = NULL; - init_extensions(); - init_extensions4(); - init_extensions6(); + fw3_init_extensions(); return h; } @@ -1151,7 +1162,7 @@ fw3_ipt_rule_append(struct fw3_ipt_rule *r, const char *fmt, ...) if (!em) { fprintf(stderr, "fw3_ipt_rule_append(): Can't find match '%s'\n", optarg); - return; + goto free; } init_match(r, em, true); @@ -1163,7 +1174,7 @@ fw3_ipt_rule_append(struct fw3_ipt_rule *r, const char *fmt, ...) if (!et) { fprintf(stderr, "fw3_ipt_rule_append(): Can't find target '%s'\n", optarg); - return; + goto free; } break; @@ -1252,6 +1263,7 @@ fw3_ipt_rule_append(struct fw3_ipt_rule *r, const char *fmt, ...) free(e); } +free: for (i = 1; i < r->argc; i++) free(r->argv[i]); @@ -1259,7 +1271,9 @@ fw3_ipt_rule_append(struct fw3_ipt_rule *r, const char *fmt, ...) xtables_rule_matches_free(&r->matches); - free(r->target->t); + if (r->target) + free(r->target->t); + free(r); /* reset all targets and matches */