diff options
Diffstat (limited to 'src/arch/dalvik/operands')
-rw-r--r-- | src/arch/dalvik/operands/pool.c | 82 |
1 files changed, 66 insertions, 16 deletions
diff --git a/src/arch/dalvik/operands/pool.c b/src/arch/dalvik/operands/pool.c index 803d173..fbe68cf 100644 --- a/src/arch/dalvik/operands/pool.c +++ b/src/arch/dalvik/operands/pool.c @@ -24,6 +24,7 @@ #include "pool.h" +#include <stdio.h> #include <string.h> @@ -181,6 +182,7 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff { const char *string; /* Chaîne de caractères #1 */ GDataType *type; /* Type à représenter */ + size_t len; /* Taille du texte à créer */ char *tmp; /* Chaîne de caractères #2 */ GBinVariable *field; /* Champ à représenter */ GBinRoutine *routine; /* Routine à représenter */ @@ -188,14 +190,30 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff switch (operand->type) { case DPT_NONE: - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "????", 4, RTT_SECTION); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "????", 4, RTT_ERROR); break; case DPT_STRING: - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "\"", 1, RTT_STRING); string = get_string_from_dex_pool(operand->format, operand->index); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, string, strlen(string), RTT_STRING); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "\"", 1, RTT_STRING); + + if (string != NULL) + { + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "\"", 1, RTT_STRING); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, string, strlen(string), RTT_STRING); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "\"", 1, RTT_STRING); + } + else + { + len = strlen(_("<bad string index (%d)>")) + 10 /* 4294967295U */ + 1; + tmp = calloc(len, sizeof(char)); + snprintf(tmp, len, _("<bad string index (%d)>"), operand->index); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, len - 1, RTT_ERROR); + + free(tmp); + + } + break; case DPT_TYPE: @@ -205,14 +223,24 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff { tmp = g_data_type_to_string(type); g_object_unref(G_OBJECT(type)); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); + } else - tmp = strdup(_("invalid type")); + { + len = strlen(_("<bad type index (%d)>")) + 10 /* 4294967295U */ + 1; + tmp = calloc(len, sizeof(char)); + snprintf(tmp, len, _("<bad type index (%d)>"), operand->index); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, len - 1, RTT_ERROR); + + } - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); free(tmp); + break; case DPT_PROTO: @@ -226,13 +254,24 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff { tmp = g_binary_variable_to_string(field, false); g_object_unref(G_OBJECT(field)); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); + } else - tmp = strdup(_("invalid field")); + { + len = strlen(_("<bad field index (%d)>")) + 10 /* 4294967295U */ + 1; + tmp = calloc(len, sizeof(char)); + snprintf(tmp, len, _("<bad field index (%d)>"), operand->index); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, len - 1, RTT_ERROR); + + } + + free(tmp); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); break; case DPT_METHOD: @@ -242,13 +281,24 @@ static void g_dalvik_pool_operand_print(const GDalvikPoolOperand *operand, GBuff { tmp = g_binary_routine_to_string(routine); g_object_unref(G_OBJECT(routine)); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); + g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); + } else - tmp = strdup(_("invalid method")); + { + len = strlen(_("<bad method index (%d)>")) + 10 /* 4294967295U */ + 1; + tmp = calloc(len, sizeof(char)); + snprintf(tmp, len, _("<bad method index (%d)>"), operand->index); + + g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, len - 1, RTT_ERROR); + + } + + free(tmp); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, "<", 1, RTT_HOOK); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, tmp, strlen(tmp), RTT_VAR_NAME); - g_buffer_line_insert_text(line, BLC_ASSEMBLY, ">", 1, RTT_HOOK); break; } |