]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
Fix tc/m_ipt memory leaks
authorDenys Fedoryshchenko <denys@visp.net.lb>
Wed, 7 Jan 2009 03:41:50 +0000 (19:41 -0800)
committerStephen Hemminger <stephen.hemminger@vyatta.com>
Wed, 7 Jan 2009 03:46:11 +0000 (19:46 -0800)
1)optind according iptables sources have to be set to 0. If it is set to 1, in
batch it will mess up things. Also in iptables sources i notice that ->tflags
and ->used need to be reset.

2)Since target->t = fw_calloc(1, size); allocated memory in function build_st,
it have to be freed at the end, or in batch we will have memory leak. TODO:
Probably it must be freed in all "return -1" cases in parse_ipt after
build_st. About this i am not sure, up to Stephen.

3)new_name was malloc'ed, but not freed

tc/m_ipt.c

index 042fe8b8a86156411ac965b683f184dc00411486..c9c453a30c861ced9788ee4fc231568ae00f88f6 100644 (file)
@@ -277,6 +277,8 @@ get_target_name(const char *name)
                if (!handle) {
                        fputs(dlerror(), stderr);
                        printf("\n");
+                       free(l_name);
+                       free(new_name);
                        return NULL;
                }
        }
@@ -292,12 +294,16 @@ get_target_name(const char *name)
                                        fputs(error, stderr);
                                        fprintf(stderr, "\n");
                                        dlclose(handle);
+                                       free(l_name);
+                                       free(new_name);
                                        return NULL;
                                }
                        }
                }
        }
 
+       free(l_name);
+       free(new_name);
        return m;
 }
 
@@ -512,8 +518,15 @@ static int parse_ipt(struct action_util *a,int *argc_p,
        *argc_p = rargc - iargc;
        *argv_p = argv;
 
-       optind = 1;
+       optind = 0;
        free_opts(opts);
+       /* Clear flags if target will be used again */
+        m->tflags=0;
+        m->used=0;
+       /* Free allocated memory */
+        if (m->t)
+            free(m->t);
+
 
        return 0;