1
0
Эх сурвалжийг харах

libobs: Add obs_add_safe_module()

derrod 2 жил өмнө
parent
commit
d90bfc5e0b

+ 9 - 0
docs/sphinx/reference-modules.rst

@@ -271,6 +271,15 @@ plugin modules.
 
 ---------------------
 
+.. function:: void *obs_add_safe_module(const char *name)
+
+   Adds a *name* to the list of modules allowed to load in Safe Mode.
+   If the list is empty, all modules are allowed.
+
+   :param  name: The name of the module (filename sans extension).
+
+---------------------
+
 .. function:: void obs_module_failure_info_free(struct obs_module_failure_info *mfi)
 
    Frees data allocated data used in the *mfi* parameter (calls

+ 1 - 0
libobs/obs-internal.h

@@ -466,6 +466,7 @@ typedef DARRAY(struct obs_source_info) obs_source_info_array_t;
 struct obs_core {
 	struct obs_module *first_module;
 	DARRAY(struct obs_module_path) module_paths;
+	DARRAY(char *) safe_modules;
 
 	obs_source_info_array_t source_types;
 	obs_source_info_array_t input_types;

+ 28 - 0
libobs/obs-module.c

@@ -274,6 +274,15 @@ void obs_add_module_path(const char *bin, const char *data)
 	da_push_back(obs->module_paths, &omp);
 }
 
+void obs_add_safe_module(const char *name)
+{
+	if (!obs || !name)
+		return;
+
+	char *item = bstrdup(name);
+	da_push_back(obs->safe_modules, &item);
+}
+
 extern void get_plugin_info(const char *path, bool *is_obs_plugin,
 			    bool *can_load);
 
@@ -282,6 +291,19 @@ struct fail_info {
 	size_t fail_count;
 };
 
+static bool is_safe_module(const char *name)
+{
+	if (!obs->safe_modules.num)
+		return true;
+
+	for (size_t i = 0; i < obs->safe_modules.num; i++) {
+		if (strcmp(name, obs->safe_modules.array[i]) == 0)
+			return true;
+	}
+
+	return false;
+}
+
 static void load_all_callback(void *param, const struct obs_module_info2 *info)
 {
 	struct fail_info *fail_info = param;
@@ -298,6 +320,12 @@ static void load_all_callback(void *param, const struct obs_module_info2 *info)
 		return;
 	}
 
+	if (!is_safe_module(info->name)) {
+		blog(LOG_WARNING, "Skipping module '%s', not on safe list",
+		     info->name);
+		return;
+	}
+
 	if (!can_load_obs_plugin) {
 		blog(LOG_WARNING,
 		     "Skipping module '%s' due to possible "

+ 4 - 0
libobs/obs.c

@@ -1441,6 +1441,10 @@ void obs_shutdown(void)
 		free_module_path(obs->module_paths.array + i);
 	da_free(obs->module_paths);
 
+	for (size_t i = 0; i < obs->safe_modules.num; i++)
+		bfree(obs->safe_modules.array[i]);
+	da_free(obs->safe_modules);
+
 	if (obs->name_store_owned)
 		profiler_name_store_free(obs->name_store);
 

+ 8 - 0
libobs/obs.h

@@ -517,6 +517,14 @@ EXPORT const char *obs_get_module_data_path(obs_module_t *module);
  */
 EXPORT void obs_add_module_path(const char *bin, const char *data);
 
+/**
+ * Adds a module to the list of modules allowed to load in Safe Mode.
+ * If the list is empty, all modules are allowed.
+ *
+ * @param  name  Specifies the module's name (filename sans extension).
+ */
+EXPORT void obs_add_safe_module(const char *name);
+
 /** Automatically loads all modules from module paths (convenience function) */
 EXPORT void obs_load_all_modules(void);