}
        type = determine_kprobe_perf_type_legacy(probe_name, retprobe);
        if (type < 0) {
+               err = type;
                pr_warn("failed to determine legacy kprobe event id for '%s+0x%zx': %s\n",
                        kfunc_name, offset,
-                       libbpf_strerror_r(type, errmsg, sizeof(errmsg)));
-               return type;
+                       libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
+               goto err_clean_legacy;
        }
        attr.size = sizeof(attr);
        attr.config = type;
                err = -errno;
                pr_warn("legacy kprobe perf_event_open() failed: %s\n",
                        libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
-               return err;
+               goto err_clean_legacy;
        }
        return pfd;
+
+err_clean_legacy:
+       /* Clear the newly added legacy kprobe_event */
+       remove_kprobe_event_legacy(probe_name, retprobe);
+       return err;
 }
 
 struct bpf_link *
                        prog->name, retprobe ? "kretprobe" : "kprobe",
                        func_name, offset,
                        libbpf_strerror_r(err, errmsg, sizeof(errmsg)));
-               goto err_out;
+               goto err_clean_legacy;
        }
        if (legacy) {
                struct bpf_link_perf *perf_link = container_of(link, struct bpf_link_perf, link);
        }
 
        return link;
+
+err_clean_legacy:
+       if (legacy)
+               remove_kprobe_event_legacy(legacy_probe, retprobe);
 err_out:
        free(legacy_probe);
        return libbpf_err_ptr(err);