[vlc-devel] commit: Check plugins directory names for unsupported capability ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sun Jan 10 11:44:24 CET 2010
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jan 10 12:36:55 2010 +0200| [52943ce6dcaa19e2924846d2225176375f49b2c8] | committer: Rémi Denis-Courmont
Check plugins directory names for unsupported capability
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=52943ce6dcaa19e2924846d2225176375f49b2c8
---
src/libvlc.h | 1 +
src/misc/cpu.c | 42 ++++++++++++++++++++++++++++++++++++++++++
src/modules/modules.c | 4 +++-
3 files changed, 46 insertions(+), 1 deletions(-)
diff --git a/src/libvlc.h b/src/libvlc.h
index e60f711..ced230e 100644
--- a/src/libvlc.h
+++ b/src/libvlc.h
@@ -79,6 +79,7 @@ void vlc_assert_locked (vlc_mutex_t *);
*/
extern uint32_t cpu_flags;
uint32_t CPUCapabilities( void );
+bool vlc_CPU_CheckPluginDir (const char *name);
/*
* Message/logging stuff
diff --git a/src/misc/cpu.c b/src/misc/cpu.c
index 6c979fd..d1b9324 100644
--- a/src/misc/cpu.c
+++ b/src/misc/cpu.c
@@ -296,6 +296,48 @@ unsigned vlc_CPU (void)
return cpu_flags;
}
+const struct
+{
+ uint32_t value;
+ char name[12];
+} cap_dirs[] = {
+#if defined ( __i386__ ) || defined ( __x86_64__ )
+ { CPU_CAPABILITY_MMX, "mmx" },
+ { CPU_CAPABILITY_MMXEXT, "mmxext" },
+ { CPU_CAPABILITY_3DNOW, "3dnow" },
+ { CPU_CAPABILITY_SSE, "sse" },
+#endif
+#if defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__)
+ { CPU_CAPABILITY_ALTIVEC, "altivec" },
+#endif
+#if defined (__arm__)
+ { CPU_CAPABILITY_NEON, "arm_neon" },
+#endif
+};
+
+/**
+ * Check if a directory name contains usable plugins w.r.t. the hardware
+ * capabilities. Loading a plugin when the hardware has insufficient
+ * capabilities may lead to illegal instructions (SIGILL) and must be avoided.
+ *
+ * @param name the name of the directory (<b>not</b> the path)
+ *
+ * @return true if the hardware has sufficient capabilities or the directory
+ * does not require any special capability; false if the running hardware has
+ * insufficient capabilities.
+ */
+bool vlc_CPU_CheckPluginDir (const char *name)
+{
+ const unsigned flags = vlc_CPU ();
+ for (size_t i = 0; i < sizeof (cap_dirs) / sizeof (cap_dirs[0]); i++)
+ {
+ if (strcmp (name, cap_dirs[i].name))
+ continue;
+ return (flags & cap_dirs[i].value) != 0;
+ }
+ return true;
+}
+
static vlc_memcpy_t pf_vlc_memcpy = memcpy;
static vlc_memset_t pf_vlc_memset = memset;
diff --git a/src/modules/modules.c b/src/modules/modules.c
index cdd2630..ec4fa31 100644
--- a/src/modules/modules.c
+++ b/src/modules/modules.c
@@ -906,7 +906,9 @@ static void AllocatePluginDir( vlc_object_t *p_this, module_bank_t *p_bank,
break;
/* Skip ".", ".." */
- if (!strcmp (file, ".") || !strcmp (file, ".."))
+ if (!strcmp (file, ".") || !strcmp (file, "..")
+ /* Skip directories for unsupported optimizations */
+ || !vlc_CPU_CheckPluginDir (file))
{
free (file);
continue;
More information about the vlc-devel
mailing list