summaryrefslogtreecommitdiff
path: root/src/analysis/scan/patterns/modifiers/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/analysis/scan/patterns/modifiers/list.c')
-rw-r--r--src/analysis/scan/patterns/modifiers/list.c59
1 files changed, 46 insertions, 13 deletions
diff --git a/src/analysis/scan/patterns/modifiers/list.c b/src/analysis/scan/patterns/modifiers/list.c
index 141fa54..86fd19f 100644
--- a/src/analysis/scan/patterns/modifiers/list.c
+++ b/src/analysis/scan/patterns/modifiers/list.c
@@ -56,7 +56,10 @@ static void g_scan_modifier_list_finalize(GScanModifierList *);
static char *g_scan_modifier_list_get_name(const GScanModifierList *);
/* Transforme une séquence d'octets pour motif de recherche. */
-static bool g_scan_modifier_list_transform(const GScanModifierList *, const sized_binary_t *, sized_binary_t **, size_t *);
+static bool g_scan_modifier_list_transform(const GScanModifierList *, const sized_binary_t *, size_t, sized_binary_t **, size_t *);
+
+/* Retrouve l'origine d'une correspondance à partir d'un indice. */
+static char *g_scan_modifier_list_get_path(const GScanModifierList *, size_t *);
@@ -96,6 +99,7 @@ static void g_scan_modifier_list_class_init(GScanModifierListClass *klass)
modifier->get_name = (get_scan_modifier_name_fc)g_scan_modifier_list_get_name;
modifier->transform = (transform_scan_token_fc)g_scan_modifier_list_transform;
+ modifier->get_path = (get_modifier_path)g_scan_modifier_list_get_path;
}
@@ -235,9 +239,9 @@ bool g_scan_modifier_list_add(GScanModifierList *list, GScanTokenModifier *modif
}
- }
+ free(name);
- free(name);
+ }
if (!result)
goto done;
@@ -344,9 +348,10 @@ static char *g_scan_modifier_list_get_name(const GScanModifierList *modifier)
/******************************************************************************
* *
* Paramètres : modifier = modificateur à solliciter. *
-* src = séquence d'octets à traiter. *
+* src = séquences d'octets à traiter. *
+* scount = quantité de ces séquences. *
* dest = nouvelle(s) séquence(s) d'octets obtenue(s) [OUT] *
-* count = quantité de ces séquences. *
+* dcount = quantité de ces séquences. *
* *
* Description : Transforme une séquence d'octets pour motif de recherche. *
* *
@@ -356,7 +361,7 @@ static char *g_scan_modifier_list_get_name(const GScanModifierList *modifier)
* *
******************************************************************************/
-static bool g_scan_modifier_list_transform(const GScanModifierList *modifier, const sized_binary_t *src, sized_binary_t **dest, size_t *count)
+static bool g_scan_modifier_list_transform(const GScanModifierList *modifier, const sized_binary_t *src, size_t scount, sized_binary_t **dest, size_t *dcount)
{
bool result; /* Bilan d'opération à renvoyer*/
size_t i; /* Boucle de parcours #1 */
@@ -366,17 +371,17 @@ static bool g_scan_modifier_list_transform(const GScanModifierList *modifier, co
size_t k; /* Boucle de parcours #2 */
*dest = NULL;
- *count = 0;
+ *dcount = 0;
for (i = 0; i < modifier->count; i++)
{
- result = g_scan_token_modifier_transform(modifier->modifiers[i], src, &extra, &extra_count);
+ result = g_scan_token_modifier_transform(modifier->modifiers[i], src, scount, &extra, &extra_count);
if (!result) goto exit;
- new = (*dest) + *count;
+ *dcount += extra_count;
+ *dest = realloc(*dest, *dcount * sizeof(sized_binary_t));
- *count += extra_count;
- *dest = realloc(*dest, *count * sizeof(sized_binary_t));
+ new = (*dest) + *dcount - extra_count;
for (k = 0; k < extra_count; k++, new++)
copy_szstr(*new, extra[k]);
@@ -389,17 +394,45 @@ static bool g_scan_modifier_list_transform(const GScanModifierList *modifier, co
if (!result)
{
- for (i = 0; i < *count; i++)
+ for (i = 0; i < *dcount; i++)
exit_szstr(dest[i]);
if (*dest != NULL)
free(*dest);
*dest = NULL;
- *count = 0;
+ *dcount = 0;
}
return result;
}
+
+
+/******************************************************************************
+* *
+* Paramètres : modifier = modificateur à consulter. *
+* index = indice de la combinaison ciblée. [OUT] *
+* *
+* Description : Retrouve l'origine d'une correspondance à partir d'un indice.*
+* *
+* Retour : Version humainement lisible de la combinaison. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static char *g_scan_modifier_list_get_path(const GScanModifierList *modifier, size_t *index)
+{
+ char *result; /* Combinaison à retourner */
+ size_t i; /* Boucle de parcours #1 */
+
+ result = NULL;
+
+ for (i = 0; i < modifier->count && result == NULL; i++)
+ result = g_scan_token_modifier_get_path(modifier->modifiers[i], index);
+
+ return result;
+
+}