libobs: Add obs_add_safe_module()

This commit is contained in:
derrod 2023-03-12 08:32:38 +01:00
parent 64be5a7f9a
commit d90bfc5e0b
5 changed files with 50 additions and 0 deletions

View file

@ -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

View file

@ -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;

View file

@ -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 "

View file

@ -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);

View file

@ -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);