summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2010-05-20 22:10:04 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2010-05-20 22:10:04 (GMT)
commit8cf0f3612c5fcb940b0a80ab6325a5c08e060430 (patch)
tree523f22de616a490fc50065f2d5b152b936de1b52
parent44478b28bc5c4a8f9b064d0ae6936662e9ad11a9 (diff)
Increased security by checking the requested index when reading a pool item.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@162 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
-rw-r--r--ChangeLog9
-rw-r--r--src/dialogs/about.c2
-rw-r--r--src/format/dex/pool.c19
-rw-r--r--src/format/dex/pool.h5
4 files changed, 29 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 7677391..969021b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+10-05-21 Cyrille Bagard <nocbos@gmail.com>
+
+ * src/dialogs/about.c:
+ Typo.
+
+ * src/format/dex/pool.h:
+ * src/format/dex/pool.c:
+ Increase security by checking the requested index when reading a pool item.
+
10-05-20 Cyrille Bagard <nocbos@gmail.com>
* src/dialogs/about.c:
diff --git a/src/dialogs/about.c b/src/dialogs/about.c
index e182f8f..44ceaa8 100644
--- a/src/dialogs/about.c
+++ b/src/dialogs/about.c
@@ -58,8 +58,8 @@ GtkWidget *create_about_dialog(GtkWindow *parent)
gchar *filename; /* Chemin d'accès au fichier */
GtkWidget *image; /* Image chargée */
unsigned int revision; /* Numéro de révision */
- unsigned int i; /* Boucle de parcours */
unsigned int max; /* Nbre. de boucles à effectuer*/
+ unsigned int i; /* Boucle de parcours */
unsigned int level; /* Unité la plus importante */
char buffer[16]; /* Nom d'image à forger */
GtkWidget *label; /* Etiquette inférieure */
diff --git a/src/format/dex/pool.c b/src/format/dex/pool.c
index dbcee52..b2ca105 100644
--- a/src/format/dex/pool.c
+++ b/src/format/dex/pool.c
@@ -48,6 +48,9 @@ const char *get_string_from_dex_pool(const GDexFormat *format, uint32_t index)
string_id_item str_id; /* Identifiant de chaîne */
string_data_item str_data; /* Description de chaîne */
+ if (index >= format->header.string_ids_size)
+ return NULL;
+
pos = format->header.string_ids_off + index * sizeof(string_id_item);
if (!read_dex_string_id_item(format, &pos, &str_id))
@@ -92,6 +95,9 @@ GOpenidaType *get_type_from_dex_pool(const GDexFormat *format, uint16_t index)
//printf("Index :: 0x%04hx\n", index);
+ if (index >= format->header.type_ids_size)
+ return NULL;
+
pos = format->header.type_ids_off + index * sizeof(type_id_item);
if (!read_dex_type_id_item(format, &pos, &type_id))
@@ -135,12 +141,15 @@ GOpenidaType *get_type_from_dex_pool(const GDexFormat *format, uint16_t index)
* *
******************************************************************************/
-GOpenidaType *get_class_from_dex_pool(const GDexFormat *format, uint16_t index)
+GOpenidaType *get_class_from_dex_pool(const GDexFormat *format, uint32_t index)
{
GOpenidaType *result; /* Instance à retourner */
off_t pos; /* Tête de lecture */
class_def_item class_def; /* Définition de la classe */
+ if (index >= format->header.class_defs_size)
+ return NULL;
+
pos = format->header.class_defs_off + index * sizeof(class_def_item);
if (!read_dex_class_def_item(format, &pos, &class_def))
@@ -180,6 +189,9 @@ GBinVariable *get_field_from_dex_pool(const GDexFormat *format, uint32_t index)
const char *name; /* Désignation humaine */
GOpenidaType *owner; /* Propriétaire du champ */
+ if (index >= format->header.field_ids_size)
+ return NULL;
+
pos = format->header.field_ids_off + index * sizeof(field_id_item);
if (!read_dex_field_id_item(format, &pos, &field_id))
@@ -231,7 +243,7 @@ GBinVariable *get_field_from_dex_pool(const GDexFormat *format, uint32_t index)
* *
******************************************************************************/
-GBinRoutine *get_routine_from_dex_pool(const GDexFormat *format, uleb128_t index)
+GBinRoutine *get_routine_from_dex_pool(const GDexFormat *format, uint32_t index)
{
GBinRoutine *result; /* Instance à retourner */
off_t pos; /* Tête de lecture */
@@ -243,6 +255,9 @@ GBinRoutine *get_routine_from_dex_pool(const GDexFormat *format, uleb128_t index
string_id_item str_id; /* Identifiant de chaîne */
string_data_item str_data; /* Description de chaîne */
+ if (index >= format->header.method_ids_size)
+ return NULL;
+
pos = format->header.method_ids_off + index * sizeof(method_id_item);
if (!read_dex_method_id_item(format, &pos, &meth_id))
diff --git a/src/format/dex/pool.h b/src/format/dex/pool.h
index 263a807..56fd99c 100644
--- a/src/format/dex/pool.h
+++ b/src/format/dex/pool.h
@@ -27,7 +27,6 @@
#include "dex.h"
#include "../../analysis/routine.h"
-#include "../../common/leb128.h"
@@ -39,7 +38,7 @@ GOpenidaType *get_type_from_dex_pool(const GDexFormat *, uint16_t);
/* Extrait une représentation de classe d'une table DEX. */
-GOpenidaType *get_class_from_dex_pool(const GDexFormat *, uint16_t);
+GOpenidaType *get_class_from_dex_pool(const GDexFormat *, uint32_t);
@@ -49,7 +48,7 @@ GOpenidaType *get_class_from_dex_pool(const GDexFormat *, uint16_t);
GBinVariable *get_field_from_dex_pool(const GDexFormat *, uint32_t);
/* Extrait une représentation de routine d'une table DEX. */
-GBinRoutine *get_routine_from_dex_pool(const GDexFormat *, uleb128_t);
+GBinRoutine *get_routine_from_dex_pool(const GDexFormat *, uint32_t);