diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-09-24 21:18:51 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-09-24 21:18:51 (GMT) |
commit | 3c970a0a1b74a1991be303132221329f3eef0b91 (patch) | |
tree | 7f3c9e8969f5c5c9fe1188c762dda0668c6f9ff6 /src/analysis/contents | |
parent | 65a4b8d9c1929fb7b171d630d336519fc4d418ef (diff) |
Prevented out of bounds access when moving the reading position forwards.
Diffstat (limited to 'src/analysis/contents')
-rw-r--r-- | src/analysis/contents/file.c | 47 | ||||
-rw-r--r-- | src/analysis/contents/restricted.c | 47 |
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. * |