From 8cf0f3612c5fcb940b0a80ab6325a5c08e060430 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Thu, 20 May 2010 22:10:04 +0000 Subject: 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 --- ChangeLog | 9 +++++++++ src/dialogs/about.c | 2 +- src/format/dex/pool.c | 19 +++++++++++++++++-- src/format/dex/pool.h | 5 ++--- 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 + + * 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 * 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); -- cgit v0.11.2-87-g4458