summaryrefslogtreecommitdiff
path: root/src/analysis/contents
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/contents')
-rw-r--r--src/analysis/contents/file.c47
-rw-r--r--src/analysis/contents/restricted.c47
2 files changed, 87 insertions, 7 deletions
diff --git a/src/analysis/contents/file.c b/src/analysis/contents/file.c
index 95cfd5d..e7bebd0 100644
--- a/src/analysis/contents/file.c
+++ b/src/analysis/contents/file.c
@@ -85,6 +85,9 @@ static void g_file_content_compute_checksum(GFileContent *, GChecksum *);
/* Détermine le nombre d'octets lisibles. */
static phys_t g_file_content_compute_size(const GFileContent *);
+/* Avance la tête de lecture d'une certaine quantité de données. */
+static bool g_file_content_seek(const GFileContent *, vmpa2t *, phys_t);
+
/* Donne accès à une portion des données représentées. */
static const bin_t *g_file_content_get_raw_access(const GFileContent *, vmpa2t *, phys_t);
@@ -183,6 +186,8 @@ static void g_file_content_interface_init(GBinContentInterface *iface)
iface->compute_size = (compute_size_fc)g_file_content_compute_size;
+ iface->seek = (seek_fc)g_file_content_seek;
+
iface->get_raw_access = (get_raw_access_fc)g_file_content_get_raw_access;
iface->read_raw = (read_raw_fc)g_file_content_read_raw;
@@ -479,31 +484,59 @@ static phys_t g_file_content_compute_size(const GFileContent *content)
* *
* Paramètres : content = contenu binaire à venir lire. *
* addr = position de la tête de lecture. *
-* length = quantité d'octets à lire. *
+* length = quantité d'octets à provisionner. *
* *
-* Description : Donne accès à une portion des données représentées. *
+* Description : Avance la tête de lecture d'une certaine quantité de données.*
* *
-* Retour : Pointeur vers les données à lire ou NULL en cas d'échec. *
+* Retour : Bilan de l'opération : true en cas de succès, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
-static const bin_t *g_file_content_get_raw_access(const GFileContent *content, vmpa2t *addr, phys_t length)
+static bool g_file_content_seek(const GFileContent *content, vmpa2t *addr, phys_t length)
{
phys_t offset; /* Emplacement de départ */
offset = get_phy_addr(addr);
if (offset == VMPA_NO_PHYSICAL)
- return NULL;
+ return false;
if ((offset + length) >= get_mrange_length(&content->range))
- return NULL;
+ return false;
advance_vmpa(addr, length);
- return &content->data[offset];
+ return true;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : content = contenu binaire à venir lire. *
+* addr = position de la tête de lecture. *
+* length = quantité d'octets à lire. *
+* *
+* Description : Donne accès à une portion des données représentées. *
+* *
+* Retour : Pointeur vers les données à lire ou NULL en cas d'échec. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static const bin_t *g_file_content_get_raw_access(const GFileContent *content, vmpa2t *addr, phys_t length)
+{
+ phys_t offset; /* Emplacement de départ */
+ bool allowed; /* Capacité d'avancer ? */
+
+ offset = get_phy_addr(addr);
+
+ allowed = g_file_content_seek(content, addr, length);
+
+ return (allowed ? &content->data[offset] : NULL);
}
diff --git a/src/analysis/contents/restricted.c b/src/analysis/contents/restricted.c
index e342242..1f996d1 100644
--- a/src/analysis/contents/restricted.c
+++ b/src/analysis/contents/restricted.c
@@ -69,6 +69,9 @@ static void g_restricted_content_finalize(GRestrictedContent *);
/* Calcule une empreinte unique (SHA256) pour les données. */
static void g_restricted_content_compute_checksum(GRestrictedContent *, GChecksum *);
+/* Avance la tête de lecture d'une certaine quantité de données. */
+static bool g_restricted_content_seek(const GRestrictedContent *, vmpa2t *, phys_t);
+
/* Donne accès à une portion des données représentées. */
static const bin_t *g_restricted_content_get_raw_access(const GRestrictedContent *, vmpa2t *, phys_t);
@@ -161,6 +164,8 @@ static void g_restricted_content_interface_init(GBinContentInterface *iface)
{
iface->compute_checksum = (compute_checksum_fc)g_restricted_content_compute_checksum;
+ 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;
@@ -286,6 +291,48 @@ static void g_restricted_content_compute_checksum(GRestrictedContent *content, G
* *
* Paramètres : content = contenu binaire à venir lire. *
* addr = position de la tête de lecture. *
+* length = quantité d'octets à provisionner. *
+* *
+* Description : Avance la tête de lecture d'une certaine quantité de données.*
+* *
+* Retour : Bilan de l'opération : true en cas de succès, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_restricted_content_seek(const GRestrictedContent *content, vmpa2t *addr, phys_t length)
+{
+ bool result; /* Bilan de lecture à renvoyer */
+ vmpa2t old; /* Copie de sauvegarde */
+
+ if (!mrange_contains_addr(&content->range, addr))
+ {
+ result = false;
+ goto bad_range;
+ }
+
+ copy_vmpa(&old, addr);
+
+ result = g_binary_content_seek(content->internal, addr, length);
+
+ if (result && !mrange_contains_addr_inclusive(&content->range, addr))
+ {
+ copy_vmpa(addr, &old);
+ result = false;
+ }
+
+ bad_range:
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : content = contenu binaire à venir lire. *
+* addr = position de la tête de lecture. *
* length = quantité d'octets à lire. *
* *
* Description : Donne accès à une portion des données représentées. *