From: Øyvind Kolås Date: Tue, 15 Mar 2022 11:56:16 +0000 (+0100) Subject: babl: prevent loading extension modules with incorrect SIMD X-Git-Tag: archive/raspbian/1%0.1.106-3+rpi1^2~15^2~3^2~4 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=19b5e21308b917419e71649da4e7d1d439364aea;p=babl.git babl: prevent loading extension modules with incorrect SIMD This now happens on top of bailing inside the individual modules - which in some cases is insufficient. This is likely sufficient to fix issue #69. --- diff --git a/babl/babl-extension.c b/babl/babl-extension.c index 554c764..3063d46 100644 --- a/babl/babl-extension.c +++ b/babl/babl-extension.c @@ -247,7 +247,8 @@ babl_extension_load (const char *path) } static void -babl_extension_load_dir (const char *base_path) +babl_extension_load_dir (const char *base_path, + const char **exclusion_patterns) { DIR *dir; @@ -269,7 +270,12 @@ babl_extension_load_dir (const char *base_path) if ((extension = strrchr (dentry->d_name, '.')) != NULL && !strcmp (extension, SHREXT)) { - babl_extension_load (path); + int excluded = 0; + for (int i = 0; exclusion_patterns[i]; i++) + if (strstr (path, exclusion_patterns[i])) + excluded = 1; + if (!excluded) + babl_extension_load (path); } babl_free (path); @@ -316,7 +322,8 @@ expand_path (char *path) /* parse the provided colon seperated list of paths to search */ void -babl_extension_load_dir_list (const char *dir_list) +babl_extension_load_dir_list (const char *dir_list, + const char **exclusion_patterns) { int eos = 0; const char *src; @@ -339,7 +346,7 @@ babl_extension_load_dir_list (const char *dir_list) { char *expanded_path = expand_path (path); if (expanded_path) { - babl_extension_load_dir (expanded_path); + babl_extension_load_dir (expanded_path, exclusion_patterns); babl_free (expanded_path); } } diff --git a/babl/babl-extension.h b/babl/babl-extension.h index 82e1d7e..50fb731 100644 --- a/babl/babl-extension.h +++ b/babl/babl-extension.h @@ -28,7 +28,8 @@ BABL_CLASS_DECLARE (extension); */ const Babl * babl_extension (const char *name); -void babl_extension_load_dir_list (const char *dir_list); +void babl_extension_load_dir_list (const char *dir_list, + const char **exclusion_patterns); typedef struct { diff --git a/babl/babl.c b/babl/babl.c index 141396f..3cb86cd 100644 --- a/babl/babl.c +++ b/babl/babl.c @@ -127,12 +127,13 @@ babl_dir_list (void) } -static void simd_init (void); +static const char **simd_init (void); void babl_init (void) { + const char **exclusion_pattern; babl_cpu_accel_set_use (1); - simd_init (); + exclusion_pattern = simd_init (); if (ref_count++ == 0) { @@ -155,7 +156,7 @@ babl_init (void) babl_sanity (); dir_list = babl_dir_list (); - babl_extension_load_dir_list (dir_list); + babl_extension_load_dir_list (dir_list, exclusion_pattern); babl_free (dir_list); if (!getenv ("BABL_INHIBIT_CACHE")) @@ -263,12 +264,14 @@ babl_trc_new_arm_neon (const char *name, #endif -static void simd_init (void) +static const char **simd_init (void) { + static const char *exclude[] = {"neon-", "x86-64-v3", "x86-64-v2", NULL}; #ifdef ARCH_X86_64 BablCpuAccelFlags accel = babl_cpu_accel_get_support (); if ((accel & BABL_CPU_ACCEL_X86_64_V3) == BABL_CPU_ACCEL_X86_64_V3) { + static const char *exclude[] = {NULL}; babl_base_init = babl_base_init_x86_64_v2; /// !! // this is correct, // it performs better @@ -276,24 +279,40 @@ static void simd_init (void) babl_trc_new = babl_trc_new_x86_64_v2; babl_trc_lookup_by_name = babl_trc_lookup_by_name_x86_64_v2; _babl_space_add_universal_rgb = _babl_space_add_universal_rgb_x86_64_v3; + return exclude; } else if ((accel & BABL_CPU_ACCEL_X86_64_V2) == BABL_CPU_ACCEL_X86_64_V2) { + static const char *exclude[] = {"x86-64-v3-", NULL}; babl_base_init = babl_base_init_x86_64_v2; babl_trc_new = babl_trc_new_x86_64_v2; babl_trc_lookup_by_name = babl_trc_lookup_by_name_x86_64_v2; _babl_space_add_universal_rgb = _babl_space_add_universal_rgb_x86_64_v2; + return exclude; + } + else + { + static const char *exclude[] = {"x86-64-v3-", "x86-64-v2-", NULL}; + return exclude; } #endif #ifdef ARCH_ARM BablCpuAccelFlags accel = babl_cpu_accel_get_support (); if ((accel & BABL_CPU_ACCEL_ARM_NEON) == BABL_CPU_ACCEL_ARM_NEON) { + static const char *exclude[] = {NULL}; babl_base_init = babl_base_init_arm_neon; babl_trc_new = babl_trc_new_arm_neon; babl_trc_lookup_by_name = babl_trc_lookup_by_name_arm_neon; _babl_space_add_universal_rgb = _babl_space_add_universal_rgb_arm_neon; + return exclude; + } + else + { + static const char *exclude[] = {"neon-", NULL}; + return exclude; } #endif + return exclude; }