diff options
Diffstat (limited to 'src/analysis/contents/restricted.c')
-rw-r--r-- | src/analysis/contents/restricted.c | 337 |
1 files changed, 204 insertions, 133 deletions
diff --git a/src/analysis/contents/restricted.c b/src/analysis/contents/restricted.c index 3e9cbbb..9b4e1c8 100644 --- a/src/analysis/contents/restricted.c +++ b/src/analysis/contents/restricted.c @@ -28,29 +28,15 @@ #include <string.h> -#include "../content-int.h" +#include "restricted-int.h" #include "../db/misc/rlestr.h" #include "../storage/serialize-int.h" +#include "../../common/extstr.h" +#include "../../core/logs.h" -/* Contenu de données binaires issues d'un contenu restreint (instance) */ -struct _GRestrictedContent -{ - GObject parent; /* A laisser en premier */ - - GBinContent *internal; /* Contenu de sous-traitance */ - - mrange_t range; /* Restriction de couverture */ - -}; - -/* Contenu de données binaires issues d'un contenu restreint (classe) */ -struct _GRestrictedContentClass -{ - GObjectClass parent; /* A laisser en premier */ - -}; +/* -------------------------- ENSEMBLE DE DONNEES BINAIRES -------------------------- */ /* Initialise la classe des contenus de données binaires. */ @@ -59,27 +45,29 @@ static void g_restricted_content_class_init(GRestrictedContentClass *); /* Initialise une instance de contenu de données binaires. */ static void g_restricted_content_init(GRestrictedContent *); -/* Procède à l'initialisation de l'interface de sérialisation. */ -static void g_restricted_content_serializable_init(GSerializableObjectInterface *); - -/* Procède à l'initialisation de l'interface de lecture. */ -static void g_restricted_content_interface_init(GBinContentInterface *); - /* Supprime toutes les références externes. */ static void g_restricted_content_dispose(GRestrictedContent *); /* Procède à la libération totale de la mémoire. */ static void g_restricted_content_finalize(GRestrictedContent *); -/* Charge un contenu depuis une mémoire tampon. */ -static bool g_restricted_content_load(GRestrictedContent *, GObjectStorage *, packed_buffer_t *); -/* Sauvegarde un contenu dans une mémoire tampon. */ -static bool g_restricted_content_store(const GRestrictedContent *, GObjectStorage *, packed_buffer_t *); + +/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */ + + +/* Associe un ensemble d'attributs au contenu binaire. */ +static void g_restricted_content_set_attributes(GRestrictedContent *, GContentAttributes *); + +/* Fournit l'ensemble des attributs associés à un contenu. */ +static GContentAttributes *g_restricted_content_get_attributes(const GRestrictedContent *); /* Donne l'origine d'un contenu binaire. */ static GBinContent *g_restricted_content_get_root(GRestrictedContent *); +/* Fournit le nom associé au contenu binaire. */ +static char *g_restricted_content_describe(const GRestrictedContent *, bool); + /* Calcule une empreinte unique (SHA256) pour les données. */ static void g_restricted_content_compute_checksum(GRestrictedContent *, GChecksum *); @@ -122,12 +110,21 @@ static bool g_restricted_content_read_uleb128(const GRestrictedContent *, vmpa2t /* Lit un nombre signé encodé au format LEB128. */ static bool g_restricted_content_read_leb128(const GRestrictedContent *, vmpa2t *, leb128_t *); +/* Charge un contenu depuis une mémoire tampon. */ +static bool g_restricted_content_load(GRestrictedContent *, GObjectStorage *, packed_buffer_t *); + +/* Sauvegarde un contenu dans une mémoire tampon. */ +static bool g_restricted_content_store(const GRestrictedContent *, GObjectStorage *, packed_buffer_t *); + + + +/* ---------------------------------------------------------------------------------- */ +/* ENSEMBLE DE DONNEES BINAIRES */ +/* ---------------------------------------------------------------------------------- */ /* Indique le type défini par la GLib pour les contenus de données. */ -G_DEFINE_TYPE_WITH_CODE(GRestrictedContent, g_restricted_content, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE(G_TYPE_SERIALIZABLE_OBJECT, g_restricted_content_serializable_init) - G_IMPLEMENT_INTERFACE(G_TYPE_BIN_CONTENT, g_restricted_content_interface_init)); +G_DEFINE_TYPE(GRestrictedContent, g_restricted_content, G_TYPE_BIN_CONTENT); /****************************************************************************** @@ -145,12 +142,45 @@ G_DEFINE_TYPE_WITH_CODE(GRestrictedContent, g_restricted_content, G_TYPE_OBJECT, static void g_restricted_content_class_init(GRestrictedContentClass *klass) { GObjectClass *object; /* Autre version de la classe */ + GBinContentClass *content; /* Version parente de la classe*/ object = G_OBJECT_CLASS(klass); object->dispose = (GObjectFinalizeFunc/* ! */)g_restricted_content_dispose; object->finalize = (GObjectFinalizeFunc)g_restricted_content_finalize; + content = G_BIN_CONTENT_CLASS(klass); + + content->set_attribs = (set_content_attributes)g_restricted_content_set_attributes; + content->get_attribs = (get_content_attributes)g_restricted_content_get_attributes; + + content->get_root = (get_content_root_fc)g_restricted_content_get_root; + + content->describe = (describe_content_fc)g_restricted_content_describe; + + content->compute_checksum = (compute_checksum_fc)g_restricted_content_compute_checksum; + + content->compute_size = (compute_size_fc)g_restricted_content_compute_size; + content->compute_start_pos = (compute_start_pos_fc)g_restricted_content_compute_start_pos; + content->compute_end_pos = (compute_end_pos_fc)g_restricted_content_compute_end_pos; + + content->seek = (seek_fc)g_restricted_content_seek; + + content->get_raw_access = (get_raw_access_fc)g_restricted_content_get_raw_access; + + content->read_raw = (read_raw_fc)g_restricted_content_read_raw; + content->read_u4 = (read_u4_fc)g_restricted_content_read_u4; + content->read_u8 = (read_u8_fc)g_restricted_content_read_u8; + content->read_u16 = (read_u16_fc)g_restricted_content_read_u16; + content->read_u32 = (read_u32_fc)g_restricted_content_read_u32; + content->read_u64 = (read_u64_fc)g_restricted_content_read_u64; + + content->read_uleb128 = (read_uleb128_fc)g_restricted_content_read_uleb128; + content->read_leb128 = (read_leb128_fc)g_restricted_content_read_leb128; + + content->load = (load_content_cb)g_restricted_content_load; + content->store = (store_content_cb)g_restricted_content_store; + } @@ -180,9 +210,9 @@ static void g_restricted_content_init(GRestrictedContent *content) /****************************************************************************** * * -* Paramètres : iface = interface GLib à initialiser. * +* Paramètres : content = instance d'objet GLib à traiter. * * * -* Description : Procède à l'initialisation de l'interface de sérialisation. * +* Description : Supprime toutes les références externes. * * * * Retour : - * * * @@ -190,19 +220,20 @@ static void g_restricted_content_init(GRestrictedContent *content) * * ******************************************************************************/ -static void g_restricted_content_serializable_init(GSerializableObjectInterface *iface) +static void g_restricted_content_dispose(GRestrictedContent *content) { - iface->load = (load_serializable_object_cb)g_restricted_content_load; - iface->store = (store_serializable_object_cb)g_restricted_content_store; + g_clear_object(&content->internal); + + G_OBJECT_CLASS(g_restricted_content_parent_class)->dispose(G_OBJECT(content)); } /****************************************************************************** * * -* Paramètres : iface = interface GLib à initialiser. * +* Paramètres : content = instance d'objet GLib à traiter. * * * -* Description : Procède à l'initialisation de l'interface de lecture. * +* Description : Procède à la libération totale de la mémoire. * * * * Retour : - * * * @@ -210,154 +241,134 @@ static void g_restricted_content_serializable_init(GSerializableObjectInterface * * ******************************************************************************/ -static void g_restricted_content_interface_init(GBinContentInterface *iface) +static void g_restricted_content_finalize(GRestrictedContent *content) { - iface->get_root = (get_content_root_fc)g_restricted_content_get_root; - - iface->compute_checksum = (compute_checksum_fc)g_restricted_content_compute_checksum; - - iface->compute_size = (compute_size_fc)g_restricted_content_compute_size; - iface->compute_start_pos = (compute_start_pos_fc)g_restricted_content_compute_start_pos; - iface->compute_end_pos = (compute_end_pos_fc)g_restricted_content_compute_end_pos; - - iface->seek = (seek_fc)g_restricted_content_seek; - - iface->get_raw_access = (get_raw_access_fc)g_restricted_content_get_raw_access; - - iface->read_raw = (read_raw_fc)g_restricted_content_read_raw; - iface->read_u4 = (read_u4_fc)g_restricted_content_read_u4; - iface->read_u8 = (read_u8_fc)g_restricted_content_read_u8; - iface->read_u16 = (read_u16_fc)g_restricted_content_read_u16; - iface->read_u32 = (read_u32_fc)g_restricted_content_read_u32; - iface->read_u64 = (read_u64_fc)g_restricted_content_read_u64; - - iface->read_uleb128 = (read_uleb128_fc)g_restricted_content_read_uleb128; - iface->read_leb128 = (read_leb128_fc)g_restricted_content_read_leb128; + G_OBJECT_CLASS(g_restricted_content_parent_class)->finalize(G_OBJECT(content)); } /****************************************************************************** * * -* Paramètres : content = instance d'objet GLib à traiter. * +* Paramètres : internal = contenu binaire où puiser les données à fournir. * +* range = espace de restrictions pour les accès. * * * -* Description : Supprime toutes les références externes. * +* Description : Charge en mémoire le contenu d'un contenu restreint. * * * -* Retour : - * +* Retour : Représentation de contenu à manipuler ou NULL en cas d'échec.* * * * Remarques : - * * * ******************************************************************************/ -static void g_restricted_content_dispose(GRestrictedContent *content) +GBinContent *g_restricted_content_new(GBinContent *internal, const mrange_t *range) { - g_clear_object(&content->internal); + GBinContent *result; /* Structure à retourner */ - G_OBJECT_CLASS(g_restricted_content_parent_class)->dispose(G_OBJECT(content)); + result = g_object_new(G_TYPE_RESTRICTED_CONTENT, NULL); + + if (!g_restricted_content_create(G_RESTRICTED_CONTENT(result), internal, range)) + g_clear_object(&result); + + return result; } /****************************************************************************** * * -* Paramètres : content = instance d'objet GLib à traiter. * +* Paramètres : content = instance à initialiser pleinement. * +* base = contenu binaire d'où réaliser une extraction. * +* path = chemin vers le contenu finalement ciblé. * +* endpoint = contenu final rendu accessible. * * * -* Description : Procède à la libération totale de la mémoire. * +* Description : Met en place un contenu restreint de données brutes. * * * -* Retour : - * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -static void g_restricted_content_finalize(GRestrictedContent *content) +bool g_restricted_content_create(GRestrictedContent *content, GBinContent *internal, const mrange_t *range) { - G_OBJECT_CLASS(g_restricted_content_parent_class)->finalize(G_OBJECT(content)); + bool result; /* Bilan à retourner */ + + content->internal = internal; + g_object_ref(G_OBJECT(content->internal)); + + copy_mrange(&content->range, range); + + result = true; + + return result; } /****************************************************************************** * * -* Paramètres : content = contenu binaire où puiser les données à fournir. * -* range = espace de restrictions pour les accès. * +* Paramètres : content = contenu binaire à venir lire. * +* range = espace de restrictions pour les accès. [OUT] * * * -* Description : Charge en mémoire le contenu d'un contenu restreint. * +* Description : Indique l'espace de restriction appliqué à un contenu. * * * -* Retour : Représentation de contenu à manipuler ou NULL en cas d'échec.* +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GBinContent *g_restricted_content_new(GBinContent *content, const mrange_t *range) +void g_restricted_content_get_range(const GRestrictedContent *content, mrange_t *range) { - GRestrictedContent *result; /* Structure à retourner */ - - result = g_object_new(G_TYPE_RESTRICTED_CONTENT, NULL); + copy_mrange(range, &content->range); - result->internal = content; - g_object_ref(G_OBJECT(result->internal)); +} - copy_mrange(&result->range, range); - return G_BIN_CONTENT(result); -} +/* ---------------------------------------------------------------------------------- */ +/* INTERACTIONS AVEC UN CONTENU BINAIRE */ +/* ---------------------------------------------------------------------------------- */ /****************************************************************************** * * -* Paramètres : content = contenu binaire où puiser les données à fournir. * -* range = espace de restrictions pour les accès. * +* Paramètres : content = contenu binaire à actualiser. * +* attribs = jeu d'attributs à lier au contenu courant. * * * -* Description : Charge en mémoire le contenu d'un contenu restreint. * +* Description : Associe un ensemble d'attributs au contenu binaire. * * * -* Retour : Représentation de contenu à manipuler ou NULL en cas d'échec.* +* Retour : - * * * * Remarques : - * * * ******************************************************************************/ -GBinContent *g_restricted_content_new_ro(const GBinContent *content, const mrange_t *range) +static void g_restricted_content_set_attributes(GRestrictedContent *content, GContentAttributes *attribs) { - GRestrictedContent *result; /* Structure à retourner */ - - result = g_object_new(G_TYPE_RESTRICTED_CONTENT, NULL); - - result->internal = (GBinContent *)content; - g_object_ref(G_OBJECT(result->internal)); - - copy_mrange(&result->range, range); - - return G_BIN_CONTENT(result); + g_binary_content_set_attributes(content->internal, attribs); } /****************************************************************************** * * -* Paramètres : content = élément GLib à constuire. * -* storage = conservateur de données à manipuler ou NULL. * -* pbuf = zone tampon à lire. * +* Paramètres : content = contenu binaire à consulter. * * * -* Description : Charge un contenu depuis une mémoire tampon. * +* Description : Fournit l'ensemble des attributs associés à un contenu. * * * -* Retour : Bilan de l'opération. * +* Retour : Jeu d'attributs liés au contenu courant. * * * * Remarques : - * * * ******************************************************************************/ -static bool g_restricted_content_load(GRestrictedContent *content, GObjectStorage *storage, packed_buffer_t *pbuf) +static GContentAttributes *g_restricted_content_get_attributes(const GRestrictedContent *content) { - bool result; /* Bilan à retourner */ - - content->internal = G_BIN_CONTENT(g_object_storage_unpack_object(storage, "contents", pbuf)); - result = (content->internal != NULL); + GContentAttributes *result; /* Instance à retourner */ - if (result) - result = unpack_mrange(&content->range, pbuf); + result = g_binary_content_get_attributes(content->internal); return result; @@ -366,26 +377,21 @@ static bool g_restricted_content_load(GRestrictedContent *content, GObjectStorag /****************************************************************************** * * -* Paramètres : content = élément GLib à consulter. * -* storage = conservateur de données à manipuler ou NULL. * -* pbuf = zone tampon à remplir. * +* Paramètres : content = contenu binaire à consulter. * * * -* Description : Sauvegarde un contenu dans une mémoire tampon. * +* Description : Donne l'origine d'un contenu binaire. * * * -* Retour : Bilan de l'opération. * +* Retour : Contenu à l'origine du contenu courant. * * * * Remarques : - * * * ******************************************************************************/ -static bool g_restricted_content_store(const GRestrictedContent *content, GObjectStorage *storage, packed_buffer_t *pbuf) +static GBinContent *g_restricted_content_get_root(GRestrictedContent *content) { - bool result; /* Bilan à retourner */ - - result = g_object_storage_pack_object(storage, "contents", G_SERIALIZABLE_OBJECT(content->internal), pbuf); + GBinContent *result; /* Contenu en place à renvoyer */ - if (result) - result = pack_mrange(&content->range, pbuf); + result = g_binary_content_get_root(content->internal); return result; @@ -395,20 +401,48 @@ static bool g_restricted_content_store(const GRestrictedContent *content, GObjec /****************************************************************************** * * * Paramètres : content = contenu binaire à consulter. * +* full = précise s'il s'agit d'une version longue ou non. * * * -* Description : Donne l'origine d'un contenu binaire. * +* Description : Fournit le nom associé au contenu binaire. * * * -* Retour : Contenu à l'origine du contenu courant. * +* Retour : Nom de fichier avec chemin absolu au besoin. * * * * Remarques : - * * * ******************************************************************************/ -static GBinContent *g_restricted_content_get_root(GRestrictedContent *content) +static char *g_restricted_content_describe(const GRestrictedContent *content, bool full) { - GBinContent *result; /* Contenu en place à renvoyer */ + char *result; /* Description à retourner */ + VMPA_BUFFER(start_str); /* Zone de départ en texte */ + vmpa2t end; /* Position de fin */ + VMPA_BUFFER(end_str); /* Zone de départ en texte */ + char *suffix; /* Construction d'un appendice */ + int ret; /* Bilan de construction */ - result = g_binary_content_get_root(content->internal); + result = g_binary_content_describe(content->internal, full); + + vmpa2_to_string(get_mrange_addr(&content->range), MDS_UNDEFINED, start_str, NULL); + + compute_mrange_end_addr(&content->range, &end); + + vmpa2_to_string(&end, MDS_UNDEFINED, end_str, NULL); + + ret = asprintf(&suffix, "[%s:%s]", start_str, end_str); + + if (ret == -1) + LOG_ERROR_N("asprintf"); + + else + { + if (result != NULL) + result = stradd(result, " "); + + result = stradd(result, suffix); + + free(suffix); + + } return result; @@ -932,19 +966,56 @@ static bool g_restricted_content_read_leb128(const GRestrictedContent *content, /****************************************************************************** * * -* Paramètres : content = contenu binaire à venir lire. * -* range = espace de restrictions pour les accès. [OUT] * +* Paramètres : content = élément GLib à constuire. * +* storage = conservateur de données à manipuler ou NULL. * +* pbuf = zone tampon à lire. * * * -* Description : Indique l'espace de restriction appliqué à un contenu. * +* Description : Charge un contenu depuis une mémoire tampon. * * * -* Retour : - * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -void g_restricted_content_get_range(const GRestrictedContent *content, mrange_t *range) +static bool g_restricted_content_load(GRestrictedContent *content, GObjectStorage *storage, packed_buffer_t *pbuf) { - copy_mrange(range, &content->range); + bool result; /* Bilan à retourner */ + + content->internal = G_BIN_CONTENT(g_object_storage_unpack_object(storage, "contents", pbuf)); + result = (content->internal != NULL); + + if (result) + result = unpack_mrange(&content->range, pbuf); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : content = élément GLib à consulter. * +* storage = conservateur de données à manipuler ou NULL. * +* pbuf = zone tampon à remplir. * +* * +* Description : Sauvegarde un contenu dans une mémoire tampon. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool g_restricted_content_store(const GRestrictedContent *content, GObjectStorage *storage, packed_buffer_t *pbuf) +{ + bool result; /* Bilan à retourner */ + + result = g_object_storage_pack_object(storage, "contents", G_SERIALIZABLE_OBJECT(content->internal), pbuf); + + if (result) + result = pack_mrange(&content->range, pbuf); + + return result; } |