Don't leak memory when encountering unknown match or target
authorJo-Philipp Wich <jow@openwrt.org>
Thu, 23 May 2013 12:38:56 +0000 (14:38 +0200)
committerJo-Philipp Wich <jow@openwrt.org>
Thu, 23 May 2013 12:38:56 +0000 (14:38 +0200)
iptables.c

index f39ed1e..cea3fcd 100644 (file)
@@ -1162,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);
                        if (!em)
                        {
                                fprintf(stderr, "fw3_ipt_rule_append(): Can't find match '%s'\n", optarg);
-                               return;
+                               goto free;
                        }
 
                        init_match(r, em, true);
                        }
 
                        init_match(r, em, true);
@@ -1174,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);
                        if (!et)
                        {
                                fprintf(stderr, "fw3_ipt_rule_append(): Can't find target '%s'\n", optarg);
-                               return;
+                               goto free;
                        }
 
                        break;
                        }
 
                        break;
@@ -1263,6 +1263,7 @@ fw3_ipt_rule_append(struct fw3_ipt_rule *r, const char *fmt, ...)
                free(e);
        }
 
                free(e);
        }
 
+free:
        for (i = 1; i < r->argc; i++)
                free(r->argv[i]);
 
        for (i = 1; i < r->argc; i++)
                free(r->argv[i]);