diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2017-03-22 17:58:36 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2017-03-22 17:58:36 (GMT) |
commit | cd956221a807e4c1961e17602d5ca641b93a937a (patch) | |
tree | 77c53ebad8404da4182fdba5b70e9f3ae8e05fbd /src/format | |
parent | 88e34a085a69d23da262a92641a80f409931ea82 (diff) |
Ensured all string symbols referenced by instructions get a label.
Diffstat (limited to 'src/format')
-rw-r--r-- | src/format/elf/strings.c | 18 | ||||
-rw-r--r-- | src/format/format.c | 12 | ||||
-rw-r--r-- | src/format/format.h | 2 |
3 files changed, 19 insertions, 13 deletions
diff --git a/src/format/elf/strings.c b/src/format/elf/strings.c index 755163e..9bcb87f 100644 --- a/src/format/elf/strings.c +++ b/src/format/elf/strings.c @@ -152,7 +152,7 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t { bool result; /* Bilan à faire remonter */ GBinContent *content; /* Contenu binaire à lire */ - char *data; /* Données copiées à traiter */ + const bin_t *data; /* Contenu complet et original */ vmpa2t pos; /* Tête de lecture */ bool cut; /* Séparation nette ? */ off_t i; /* Boucle de parcours */ @@ -161,7 +161,8 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t GBinSymbol *symbol; /* Symbole à intégrer */ char *label; /* Désignation de la chaîne */ - if (address == 0) return false; + if (address == 0) + return false; result = false; @@ -169,11 +170,11 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t content = g_binary_format_get_content(G_BIN_FORMAT(format)); - data = (char *)malloc(size * sizeof(char)); - init_vmpa(&pos, start, address); - if (!g_binary_content_read_raw(content, &pos, size, (bin_t *)data)) + data = g_binary_content_get_raw_access(content, &pos, size); + + if (data == NULL) goto pesd_error; /* Boucle de parcours */ @@ -194,8 +195,7 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t init_vmpa(&pos, start + i, address + i); - instr = g_raw_instruction_new_array(G_BIN_FORMAT(format)->content, MDS_8_BITS, - end - i, &pos, format->endian); + instr = g_raw_instruction_new_array(content, MDS_8_BITS, end - i, &pos, format->endian); g_raw_instruction_mark_as_string(G_RAW_INSTRUCTION(instr), true); @@ -207,7 +207,7 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t { init_vmpa(&pos, start + i, address + i); - label = create_string_label(G_BIN_FORMAT(format), &pos, &data[i], end - i); + label = create_string_label(G_BIN_FORMAT(format), &pos, end - i); g_binary_symbol_set_alt_label(symbol, label); @@ -229,8 +229,6 @@ bool parse_elf_string_data(GElfFormat *format, phys_t start, phys_t size, virt_t g_object_unref(G_OBJECT(content)); - free(data); - return result; } diff --git a/src/format/format.c b/src/format/format.c index 327b28e..978a3d2 100644 --- a/src/format/format.c +++ b/src/format/format.c @@ -546,7 +546,6 @@ GBinSymbol **g_binary_format_get_symbols(const GBinFormat *format, size_t *count * * * Paramètres : format = informations chargées à consulter. * * addr = adresse liée à la chaîne à traiter. * -* base = contenu complet et original d'une chaîne. * * length = taille de la chaîne à représenter. * * * * Description : Construit une désignation pour chaîne de caractères. * @@ -557,9 +556,11 @@ GBinSymbol **g_binary_format_get_symbols(const GBinFormat *format, size_t *count * * ******************************************************************************/ -char *create_string_label(GBinFormat *format, const vmpa2t *addr, const char *base, size_t length) +char *create_string_label(GBinFormat *format, const vmpa2t *addr, size_t length) { char *result; /* Nouvelle chaîne à retourner */ + vmpa2t pos; /* Tête de lecture modifiable */ + const bin_t *base; /* Contenu complet et original */ unsigned int wc; /* Nombre de mots rencontrés */ size_t iter; /* Tête d'écriture de recopie */ size_t i; /* Boucle de parcours */ @@ -567,6 +568,13 @@ char *create_string_label(GBinFormat *format, const vmpa2t *addr, const char *ba GBinSymbol *found; /* Symbole similaire trouvé */ VMPA_BUFFER(last_sfx); /* Dernier suffixe à intégrer */ + copy_vmpa(&pos, addr); + + base = g_binary_content_get_raw_access(format->content, &pos, length); + + if (base == NULL) + return NULL; + result = (char *)calloc(length + 5 + VMPA_MAX_LEN + 1, sizeof(char)); wc = 0; diff --git a/src/format/format.h b/src/format/format.h index d97f542..c2ef895 100644 --- a/src/format/format.h +++ b/src/format/format.h @@ -77,7 +77,7 @@ void g_binary_format_remove_symbol(GBinFormat *, GBinSymbol *); GBinSymbol **g_binary_format_get_symbols(const GBinFormat *, size_t *); /* Construit une désignation pour chaîne de caractères. */ -char *create_string_label(GBinFormat *, const vmpa2t *, const char *, size_t); +char *create_string_label(GBinFormat *, const vmpa2t *, size_t); /* Recherche le symbole correspondant à une étiquette. */ bool g_binary_format_find_symbol_by_label(GBinFormat *, const char *, GBinSymbol **); |