From 57f1070726ef6a8d5c0381d65a7da25818bff923 Mon Sep 17 00:00:00 2001 From: pelijah Date: Mon, 6 May 2024 02:01:26 +0300 Subject: [PATCH] Fix double free issue in bin_le (#4473) --- librz/bin/format/le/le.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/librz/bin/format/le/le.c b/librz/bin/format/le/le.c index a65dee8033..70177ec301 100644 --- a/librz/bin/format/le/le.c +++ b/librz/bin/format/le/le.c @@ -1686,22 +1686,23 @@ RZ_OWN RzPVector /**/ *rz_bin_le_get_entry_points(RzBinFile *bf) { return entries; } +static void str_copy(void *dst, void *src) { + char **_dst = (char **)dst; + char **_src = (char **)src; + *_dst = strdup(*_src); +} + RZ_OWN RzPVector /**/ *rz_bin_le_get_libs(RzBinFile *bf) { rz_bin_le_obj_t *bin = bf->o->bin_obj; if (rz_pvector_empty(bin->imp_mod_names)) { return NULL; } - RzPVector *libs = rz_pvector_new(free); - if (!libs) { - fail_cleanup: - rz_pvector_free(libs); - return NULL; + RzPVector *ret = rz_pvector_clonef(bin->imp_mod_names, str_copy); + if (ret) { + ret->v.free = bin->imp_mod_names->v.free; + ret->v.free_user = bin->imp_mod_names->v.free_user; } - void **it; - rz_pvector_foreach (bin->imp_mod_names, it) { - CHECK(rz_pvector_push(libs, *it)); - } - return libs; + return ret; } #define VFILE_NAME_PATCHED "patched"