diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2012-11-25 22:00:02 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2012-11-25 22:00:02 (GMT) | 
| commit | 671cacb80fd438a5f4d51db853ed08d7a6edb9ab (patch) | |
| tree | 3081bc41bca43137cca75e52fcbcf81798e8b4e2 /src/arch/dalvik/operands | |
| parent | 40d448bc4734882ca4a2580b481738f4720ebabe (diff) | |
Fortified Chrysalide a little bit against wrong APK files.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@291 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
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;      } | 
