From 3231349bac6aae1f236416a8a51f41caccc38961 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 28 Jan 2024 21:07:24 +0100 Subject: Update the current scan backend warm-up. --- src/analysis/scan/patterns/backend-int.h | 2 +- src/analysis/scan/patterns/backend.c | 11 ++++++--- src/analysis/scan/patterns/backend.h | 2 +- src/analysis/scan/patterns/backends/acism.c | 35 +++++++++++++++++++---------- src/analysis/scan/scanner.c | 13 ++++++----- 5 files changed, 40 insertions(+), 23 deletions(-) diff --git a/src/analysis/scan/patterns/backend-int.h b/src/analysis/scan/patterns/backend-int.h index 90daec9..aeabe1b 100644 --- a/src/analysis/scan/patterns/backend-int.h +++ b/src/analysis/scan/patterns/backend-int.h @@ -36,7 +36,7 @@ typedef size_t (* get_backend_atom_max_size_fc) (const GEngineBackend *); typedef patid_t (* enroll_plain_into_backend_fc) (GEngineBackend *, const uint8_t *, size_t, uint32_t [2]); /* Met en ordre les derniers détails avant un premier scan. */ -typedef void (* warm_up_backend_fc) (GEngineBackend *); +typedef bool (* warm_up_backend_fc) (GEngineBackend *); /* Récupère les identifiants finaux pour un motif recherché. */ typedef patid_t (* build_backend_plain_pattern_id_fc) (const GEngineBackend *, const uint32_t [2]); diff --git a/src/analysis/scan/patterns/backend.c b/src/analysis/scan/patterns/backend.c index 50cc889..a887600 100644 --- a/src/analysis/scan/patterns/backend.c +++ b/src/analysis/scan/patterns/backend.c @@ -187,20 +187,25 @@ bool g_engine_backend_enroll_plain_pattern(GEngineBackend *backend, const uint8_ * * * Description : Met en ordre les derniers détails avant un premier scan. * * * -* Retour : - * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -void g_engine_backend_warm_up(GEngineBackend *backend) +bool g_engine_backend_warm_up(GEngineBackend *backend) { + bool result; /* Bilan à retourner */ GEngineBackendClass *class; /* Classe à activer */ class = G_ENGINE_BACKEND_GET_CLASS(backend); if (class->warm_up != NULL) - class->warm_up(backend); + result = class->warm_up(backend); + else + result = true; + + return result; } diff --git a/src/analysis/scan/patterns/backend.h b/src/analysis/scan/patterns/backend.h index 71c97d1..3f9be03 100644 --- a/src/analysis/scan/patterns/backend.h +++ b/src/analysis/scan/patterns/backend.h @@ -60,7 +60,7 @@ size_t g_engine_backend_get_atom_max_size(const GEngineBackend *); bool g_engine_backend_enroll_plain_pattern(GEngineBackend *, const uint8_t *, size_t, uint32_t [2]); /* Met en ordre les derniers détails avant un premier scan. */ -void g_engine_backend_warm_up(GEngineBackend *); +bool g_engine_backend_warm_up(GEngineBackend *); /* Récupère les identifiants finaux pour un motif recherché. */ patid_t g_engine_backend_build_plain_pattern_id(const GEngineBackend *, const uint32_t [2]); diff --git a/src/analysis/scan/patterns/backends/acism.c b/src/analysis/scan/patterns/backends/acism.c index a36e4b7..d517168 100644 --- a/src/analysis/scan/patterns/backends/acism.c +++ b/src/analysis/scan/patterns/backends/acism.c @@ -37,10 +37,10 @@ /* ---------------------- IMPLANTATION D'UNE NOUVELLE APPROCHE ---------------------- */ -/* Initialise la classe des méthodes basée sur Bitmap. */ +/* Initialise la classe des méthodes basée sur ACISM. */ static void g_acism_backend_class_init(GAcismBackendClass *); -/* Initialise une instance de méthodes basée sur Bitmap. */ +/* Initialise une instance de méthodes basée sur ACISM. */ static void g_acism_backend_init(GAcismBackend *); /* Supprime toutes les références externes. */ @@ -92,15 +92,15 @@ static void g_acism_backend_prepare_interleave_array(GAcismBackend *); /* Compresse l'arborescence dans un tableau de position. */ static void g_acism_backend_build_interleave_array(GAcismBackend *); -/* Détermine le nombre d'identifiants constitués. */ -static size_t g_acism_backend_count_plain_pattern_ids(const GAcismBackend *); - /* Met en ordre les derniers détails avant un premier scan. */ -static void g_acism_backend_warm_up(GAcismBackend *); +static bool g_acism_backend_warm_up(GAcismBackend *); /* Récupère les identifiants finaux pour un motif recherché. */ static patid_t g_acism_backend_build_plain_pattern_id(const GAcismBackend *, const uint32_t [2]); +/* Détermine le nombre d'identifiants constitués. */ +static size_t g_acism_backend_count_plain_pattern_ids(const GAcismBackend *); + /* Parcours un contenu binaire à la recherche de motifs. */ static void g_acism_backend_run_scan(const GAcismBackend *, GScanContext *); @@ -125,7 +125,7 @@ G_DEFINE_TYPE(GAcismBackend, g_acism_backend, G_TYPE_ENGINE_BACKEND); * * * Paramètres : klass = classe à initialiser. * * * -* Description : Initialise la classe des méthodes basée sur Bitmap. * +* Description : Initialise la classe des méthodes basée sur ACISM. * * * * Retour : - * * * @@ -160,7 +160,7 @@ static void g_acism_backend_class_init(GAcismBackendClass *klass) * * * Paramètres : backend = instance à initialiser. * * * -* Description : Initialise une instance de méthodes basée sur Bitmap. * +* Description : Initialise une instance de méthodes basée sur ACISM. * * * * Retour : - * * * @@ -1121,14 +1121,18 @@ static void g_acism_backend_build_interleave_array(GAcismBackend *backend) * * * Description : Met en ordre les derniers détails avant un premier scan. * * * -* Retour : - * +* Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ -static void g_acism_backend_warm_up(GAcismBackend *backend) +static bool g_acism_backend_warm_up(GAcismBackend *backend) { + bool result; /* Bilan à retourner */ + + result = true; + #ifdef __USE_BYTE_FREQ /** @@ -1163,6 +1167,8 @@ static void g_acism_backend_warm_up(GAcismBackend *backend) g_acism_backend_build_interleave_array(backend); + return result; + } @@ -1184,6 +1190,8 @@ static patid_t g_acism_backend_build_plain_pattern_id(const GAcismBackend *backe patid_t result; /* Identifiant à retourner */ acism_source_t *source; /* Motif d'origine concerné */ + assert(tmp_id[0] < backend->sources_count); + source = backend->sources + tmp_id[0]; result = source->coverage[SOURCE_COVERAGE_START] + tmp_id[1]; @@ -1211,7 +1219,10 @@ static size_t g_acism_backend_count_plain_pattern_ids(const GAcismBackend *backe { size_t result; /* Quantité à retourner */ - result = backend->sources[backend->sources_count -1].coverage[SOURCE_COVERAGE_END]; + if (backend->sources_count == 0) + result = 0; + else + result = backend->sources[backend->sources_count - 1].coverage[SOURCE_COVERAGE_END]; return result; @@ -1248,8 +1259,8 @@ static void g_acism_backend_run_scan(const GAcismBackend *backend, GScanContext acism_code_t code; /* Code du caractère courant */ unsigned int next; /* Prochaine tête à valider */ acism_state_t next_state; /* Prochaine tête à valider */ - uint32_t final_k; /* Dernier indice à traiter */ uint32_t k; /* Boucle de parcours #2 */ + uint32_t final_k; /* Dernier indice à traiter */ unsigned int iter; /* Boucle de parcours #3 */ acism_state_t test_state; /* Test de validité alternative*/ acism_state_t sub_state; /* Test de validité alternative*/ diff --git a/src/analysis/scan/scanner.c b/src/analysis/scan/scanner.c index 507fa6f..f320f93 100644 --- a/src/analysis/scan/scanner.c +++ b/src/analysis/scan/scanner.c @@ -493,7 +493,7 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions * GScanRule *rule; /* Règle à consulter */ const char *name; /* Désignation de la règle */ -#if 0 +#if 0 // FIXME int policy; struct sched_param sp; @@ -539,17 +539,18 @@ GScanContext *g_content_scanner_analyze(GContentScanner *scanner, GScanOptions * for (i = 0; i < scanner->rule_count && status; i++) status = g_scan_rule_setup_backend(scanner->rules[i], scanner->data_backend, result); + if (status) + status = g_engine_backend_warm_up(scanner->data_backend); + + for (i = 0; i < scanner->rule_count && status; i++) + status = g_scan_rule_define_pattern_ids(scanner->rules[i], scanner->data_backend); + if (!status) { g_clear_object(&result); goto exit; } - g_engine_backend_warm_up(scanner->data_backend); - - for (i = 0; i < scanner->rule_count && status; i++) - status = g_scan_rule_define_pattern_ids(scanner->rules[i], scanner->data_backend); - /* Affichage éventuel de statistiques */ if (g_scan_options_get_print_stats(options)) -- cgit v0.11.2-87-g4458