Fix double free in class method handling ##bin

This commit is contained in:
pancake 2023-02-21 18:09:20 +01:00
parent 01e164d1ba
commit a447839f5a
3 changed files with 25 additions and 1 deletions

View File

@ -1112,6 +1112,7 @@ R_API RBinSymbol *r_bin_file_add_method(RBinFile *bf, const char *klass, const c
sym->lang = lang;
char *name = r_str_newf ("%s::%s", klass, method);
ht_pp_insert (bf->o->methods_ht, name, sym);
// RBinSymbol *dsym = r_bin_symbol_clone (sym);
r_list_append (c->methods, sym);
free (name);
}

View File

@ -88,6 +88,22 @@ static char *swiftField(const char *dn, const char *cn) {
return NULL;
}
// R2_590 - move into rbin as public api
static RBinSymbol *r_bin_symbol_clone(RBinSymbol *bs) {
RBinSymbol *nbs = R_NEW (RBinSymbol);
memcpy (nbs, bs, sizeof (RBinSymbol));
nbs->name = strdup (nbs->name);
if (nbs->dname) {
nbs->dname = strdup (nbs->dname);
}
if (nbs->libname) {
nbs->libname = strdup (nbs->libname);
}
if (nbs->classname) {
nbs->classname = strdup (nbs->classname);
}
return nbs;
}
static RList *classes_from_symbols(RBinFile *bf) {
RBinSymbol *sym;
RListIter *iter;
@ -113,7 +129,8 @@ static RList *classes_from_symbols(RBinFile *bf) {
if (!mn) {
mn = strstr (dn, cn);
if (mn && mn[strlen (cn)] == '.') {
r_list_append (c->methods, sym);
RBinSymbol *dsym = r_bin_symbol_clone (sym);
r_list_append (c->methods, dsym);
}
}
}

View File

@ -15,3 +15,9 @@ git grep 'sprintf (' libr | wc -l
printf -- "eUsage\t"
git grep 'eprintf (' libr | grep Usage | wc -l
printf -- "f(char)\t"
git grep 'free ((char' libr | wc -l
printf -- "f(void)\t"
git grep 'free ((void' libr | wc -l