/* Init vmlinux path */
        ret = init_vmlinux();
-       if (ret < 0)
+       if (ret < 0) {
+               free(pkgs);
                return ret;
+       }
 
        /* Loop 1: convert all events */
        for (i = 0; i < npevs; i++) {
                ret = __add_probe_trace_events(pkgs[i].pev, pkgs[i].tevs,
                                                pkgs[i].ntevs, force_add);
 end:
-       /* Loop 3: cleanup trace events  */
-       for (i = 0; i < npevs; i++)
+       /* Loop 3: cleanup and free trace events  */
+       for (i = 0; i < npevs; i++) {
                for (j = 0; j < pkgs[i].ntevs; j++)
                        clear_probe_trace_event(&pkgs[i].tevs[j]);
+               free(pkgs[i].tevs);
+       }
+       free(pkgs);
 
        return ret;
 }