From 84581571e138d5b7984b6d3198296013ec157d30 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Tue, 16 Oct 2012 23:16:25 +0000
Subject: Fixed many bugs using valgrind.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@269 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                    | 27 +++++++++++++++++++++++++++
 plugins/pychrysa/plugin.c    |  9 +++++++++
 src/analysis/binaries/file.c |  5 +----
 src/analysis/binary.c        | 14 ++++++++++----
 src/arch/dalvik/processor.c  |  2 ++
 src/format/dex/dex.c         |  2 ++
 src/format/format.c          |  9 ++++++++-
 src/gtkext/gtksourceview.c   |  5 ++---
 src/plugins/plugin.c         |  7 -------
 9 files changed, 61 insertions(+), 19 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5d3e7c6..b7572f3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+12-10-17  Cyrille Bagard <nocbos@gmail.com>
+
+	* plugins/pychrysa/plugin.c:
+	The one which reallocs has to become the one which frees !
+
+	* src/analysis/binaries/file.c:
+	See plugins/pychrysa/plugin.c.
+
+	* src/analysis/binary.c:
+	Handle the case where no source is found.
+
+	* src/arch/dalvik/processor.c:
+	Add missing disassembling call references for DOP_SUB_LONG_2ADDR
+	and DOP_MUL_LONG_2ADDR.
+
+	* src/format/dex/dex.c:
+	Handle the case where no source is found.
+
+	* src/format/format.c:
+	See plugins/pychrysa/plugin.c.
+
+	* src/gtkext/gtksourceview.c:
+	Formally handle the case where no source is found.
+
+	* src/plugins/plugin.c:
+	See plugins/pychrysa/plugin.c.
+
 12-10-16  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/analysis/disass/output.c:
diff --git a/plugins/pychrysa/plugin.c b/plugins/pychrysa/plugin.c
index 70ca26e..9601432 100644
--- a/plugins/pychrysa/plugin.c
+++ b/plugins/pychrysa/plugin.c
@@ -440,13 +440,20 @@ static MatchingFormatAction g_python_plugin_is_matching(const GPythonPlugin *plu
         if (result != MFA_NONE && new_data == Py_None) goto is_matching_bad;
 
         if (new_filename != Py_None)
+        {
+            free(*filename);
             *filename = strdup(PyString_AsString(new_filename));
+        }
+
         /**
          * La suppression de la part du greffon n'est permise que
          * si une prise en charge est assurée.
          */
         else if (result != MFA_NONE)
+        {
+            free(*filename);
             *filename = NULL;
+        }
 
         /**
          * Pareil que précédemment.
@@ -456,6 +463,8 @@ static MatchingFormatAction g_python_plugin_is_matching(const GPythonPlugin *plu
             tmp = PyByteArray_AsString(new_data);
             *length = PyByteArray_Size(new_data);
 
+            free(*data);
+
             *data = (bin_t *)calloc(*length, sizeof(bin_t));
             memcpy(*data, tmp, *length * sizeof(bin_t));
 
diff --git a/src/analysis/binaries/file.c b/src/analysis/binaries/file.c
index 0be1fd7..46307fb 100644
--- a/src/analysis/binaries/file.c
+++ b/src/analysis/binaries/file.c
@@ -162,7 +162,6 @@ GLoadedBinary *g_file_binary_new_from_file(const char *filename)
 {
     GFileBinary *result;                    /* Adresse à retourner         */
     GLoadedBinary *loaded;                  /* Version parente             */
-    char *tmp;                              /* Nom de fichier modifiable   */
 
     result = g_object_new(G_TYPE_FILE_BINARY, NULL);
     loaded = G_LOADED_BINARY(result);
@@ -171,10 +170,8 @@ GLoadedBinary *g_file_binary_new_from_file(const char *filename)
 
     result->filename = strdup(filename);
 
-    tmp = strdup(filename);
-    loaded->format = G_EXE_FORMAT(load_new_format(FMT_EXEC, tmp,
+    loaded->format = G_EXE_FORMAT(load_new_format(FMT_EXEC, filename,
                                                   &loaded->bin_data, &loaded->bin_length));
-    free(tmp);
 
     if (loaded->format == NULL)
     {
diff --git a/src/analysis/binary.c b/src/analysis/binary.c
index fe8188b..d5bf029 100644
--- a/src/analysis/binary.c
+++ b/src/analysis/binary.c
@@ -733,7 +733,10 @@ GCodeBuffer *g_loaded_binary_get_decompiled_buffer(const GLoadedBinary *binary,
 {
     GCodeBuffer *result;                    /* Tampon à retourner          */
 
-    if (index >= binary->decbuf_count)
+    if (binary->decbuf_count == 0)
+        result = NULL;
+
+    else if (index >= binary->decbuf_count)
         result = binary->dec_buffers[binary->defsrc];
 
     else
@@ -792,11 +795,14 @@ void ack_completed_disassembly(void/*GDelayedDisassembly*/ *disass, GLoadedBinar
     files = g_binary_format_get_source_files(G_BIN_FORMAT(binary->format),
                                              &binary->decbuf_count, &binary->defsrc);
 
-    binary->dec_buffers = (GCodeBuffer **)calloc(binary->decbuf_count, sizeof(GCodeBuffer *));
+    if (binary->decbuf_count > 0)
+    {
+        binary->dec_buffers = (GCodeBuffer **)calloc(binary->decbuf_count, sizeof(GCodeBuffer *));
 
-    for (i = 0; i < binary->decbuf_count; i++)
-        binary->dec_buffers[i] = decompile_all_from_file(binary, files[i]);
+        for (i = 0; i < binary->decbuf_count; i++)
+            binary->dec_buffers[i] = decompile_all_from_file(binary, files[i]);
 
+    }
 
 
 
diff --git a/src/arch/dalvik/processor.c b/src/arch/dalvik/processor.c
index ef4b733..fbba5e2 100644
--- a/src/arch/dalvik/processor.c
+++ b/src/arch/dalvik/processor.c
@@ -427,6 +427,8 @@ static GArchInstruction *g_dalvik_processor_decode_instruction(const GDalvikProc
         [DOP_SHR_INT_2ADDR]         = dalvik_read_instr_shr_int_2addr,
         [DOP_USHR_INT_2ADDR]        = dalvik_read_instr_ushr_int_2addr,
         [DOP_ADD_LONG_2ADDR]        = dalvik_read_instr_add_long_2addr,
+        [DOP_SUB_LONG_2ADDR]        = dalvik_read_instr_sub_long_2addr,
+        [DOP_MUL_LONG_2ADDR]        = dalvik_read_instr_mul_long_2addr,
 
         [DOP_SHL_LONG_2ADDR]        = dalvik_read_instr_shl_long_2addr,
         [DOP_SHR_LONG_2ADDR]        = dalvik_read_instr_shr_long_2addr,
diff --git a/src/format/dex/dex.c b/src/format/dex/dex.c
index 821da7a..b286f7c 100755
--- a/src/format/dex/dex.c
+++ b/src/format/dex/dex.c
@@ -255,6 +255,8 @@ static void g_dex_format_find_all_sources(GDexFormat *format)
     for (i = 0; i < format->classes_count; i++)
     {
         source = g_dex_class_get_source_file(format->classes[i], format);
+        if (source == NULL) continue;
+
         found = false;
 
         for (k = 0; k < bf->src_count && !found; k++)
diff --git a/src/format/format.c b/src/format/format.c
index 4f6df03..f1ea4d4 100644
--- a/src/format/format.c
+++ b/src/format/format.c
@@ -503,6 +503,7 @@ bool init_all_formats(void)
 GBinFormat *load_new_format(FormatType type, char *filename, bin_t **content, off_t *length)
 {
     GBinFormat *result;                     /* Adresse à retourner         */
+    char *tmp;                              /* Nom de fichier modifiable   */
     GPluginModule **pglist;                 /* Liste de greffons           */
     size_t pgcount;                         /* Taille de cette liste       */
     size_t i;                               /* Boucle de parcours          */
@@ -513,6 +514,8 @@ GBinFormat *load_new_format(FormatType type, char *filename, bin_t **content, of
 
 
 
+    tmp = strdup(filename);
+
     pglist = get_all_plugins_for_action(PGA_FORMAT_MATCHER, &pgcount);
 
     if (pgcount > 0)
@@ -520,7 +523,7 @@ GBinFormat *load_new_format(FormatType type, char *filename, bin_t **content, of
  lnf_rescan:
 
         for (i = 0; i < pgcount; i++)
-            switch (g_plugin_module_is_matching(pglist[i], &filename, content, length))
+            switch (g_plugin_module_is_matching(pglist[i], &tmp, content, length))
             {
                 case MFA_MATCHED:
                     /* FIXME */
@@ -539,6 +542,10 @@ GBinFormat *load_new_format(FormatType type, char *filename, bin_t **content, of
 
     }
 
+    if (tmp == NULL)
+        free(tmp);
+
+
 
 
     for (i = 0; i < FID_COUNT && result == NULL; i++)
diff --git a/src/gtkext/gtksourceview.c b/src/gtkext/gtksourceview.c
index 5faed7b..4d8af09 100644
--- a/src/gtkext/gtksourceview.c
+++ b/src/gtkext/gtksourceview.c
@@ -151,9 +151,8 @@ static void gtk_source_view_attach_binary(GtkSourceView *view, GLoadedBinary *bi
 
     buffer = g_loaded_binary_get_decompiled_buffer(binary, -1);
 
-    /* FIXME */
+    /* Si une source existe... */
     if (buffer != NULL)
-
-    gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), g_buffer_view_new(buffer), addr, code);
+        gtk_buffer_view_attach_buffer(GTK_BUFFER_VIEW(view), g_buffer_view_new(buffer), addr, code);
 
 }
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index 0cdcb04..89b46f0 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -357,13 +357,6 @@ MatchingFormatAction g_plugin_module_is_matching(const GPluginModule *plugin, ch
 
     result = plugin->is_matching(plugin, filename, data, length);
 
-    if (result == MFA_RELOAD)
-    {
-        if (old_filename != NULL)
-            free(old_filename);
-        free(old_data);
-    }
-
     return result;
 
 }
-- 
cgit v0.11.2-87-g4458