diff --git a/src/broker_control.c b/src/broker_control.c index a5b30572..964e4283 100644 --- a/src/broker_control.c +++ b/src/broker_control.c @@ -149,7 +149,7 @@ static int broker__process_get_plugin_info(cJSON *j_responses, struct mosquitto } for(i=0; isecurity_options.plugin_config_count; i++){ - if(add_plugin_info(j_plugins, db.config->security_options.plugin_configs[i].plugin.identifier)){ + if(add_plugin_info(j_plugins, db.config->security_options.plugin_configs[i]->plugin.identifier)){ goto internal_error; } } diff --git a/src/conf.c b/src/conf.c index 0cbffdf6..c2a001db 100644 --- a/src/conf.c +++ b/src/conf.c @@ -226,7 +226,7 @@ static void config__cleanup_plugins(struct mosquitto__config *config) if(config->security_options.plugin_configs){ for(i=0; isecurity_options.plugin_config_count; i++){ - plug = &config->security_options.plugin_configs[i]; + plug = config->security_options.plugin_configs[i]; mosquitto__free(plug->path); plug->path = NULL; @@ -239,6 +239,7 @@ static void config__cleanup_plugins(struct mosquitto__config *config) plug->options = NULL; plug->option_count = 0; } + mosquitto__free(plug); } mosquitto__free(config->security_options.plugin_configs); config->security_options.plugin_configs = NULL; @@ -985,13 +986,19 @@ static int config__read_file_core(struct mosquitto__config *config, bool reload, conf__set_cur_security_options(config, cur_listener, &cur_security_options); } - cur_security_options->plugin_configs = mosquitto__realloc(cur_security_options->plugin_configs, (size_t)(cur_security_options->plugin_config_count+1)*sizeof(struct mosquitto__plugin_config)); + cur_plugin_config = mosquitto__calloc(1, sizeof(struct mosquitto__plugin_config)); + if(!cur_plugin_config){ + log__printf(NULL, MOSQ_LOG_ERR, "Error: Out of memory."); + return MOSQ_ERR_NOMEM; + } + + cur_security_options->plugin_configs = mosquitto__realloc(cur_security_options->plugin_configs, (size_t)(cur_security_options->plugin_config_count+1)*sizeof(struct mosquitto__plugin_config *)); if(!cur_security_options->plugin_configs){ + mosquitto__free(cur_plugin_config); log__printf(NULL, MOSQ_LOG_ERR, "Error: Out of memory."); return MOSQ_ERR_NOMEM; } - cur_plugin_config = &cur_security_options->plugin_configs[cur_security_options->plugin_config_count]; - memset(cur_plugin_config, 0, sizeof(struct mosquitto__plugin_config)); + cur_security_options->plugin_configs[cur_security_options->plugin_config_count] = cur_plugin_config; cur_plugin_config->path = NULL; cur_plugin_config->options = NULL; cur_plugin_config->option_count = 0; diff --git a/src/mosquitto_broker_internal.h b/src/mosquitto_broker_internal.h index 86375526..4157db4b 100644 --- a/src/mosquitto_broker_internal.h +++ b/src/mosquitto_broker_internal.h @@ -178,7 +178,7 @@ struct mosquitto__security_options { char *password_file; char *psk_file; char *acl_file; - struct mosquitto__plugin_config *plugin_configs; + struct mosquitto__plugin_config **plugin_configs; int plugin_config_count; int8_t allow_anonymous; bool allow_zero_length_clientid; diff --git a/src/security.c b/src/security.c index a09cd64a..79324ae2 100644 --- a/src/security.c +++ b/src/security.c @@ -63,20 +63,20 @@ static int security__module_init_single(struct mosquitto__listener *listener, st } for(i=0; iplugin_config_count; i++){ - if(opts->plugin_configs[i].path){ - memset(&opts->plugin_configs[i].plugin, 0, sizeof(struct mosquitto__plugin)); + if(opts->plugin_configs[i]->path){ + memset(&opts->plugin_configs[i]->plugin, 0, sizeof(struct mosquitto__plugin)); - log__printf(NULL, MOSQ_LOG_INFO, "Loading plugin: %s", opts->plugin_configs[i].path); + log__printf(NULL, MOSQ_LOG_INFO, "Loading plugin: %s", opts->plugin_configs[i]->path); - lib = LIB_LOAD(opts->plugin_configs[i].path); + lib = LIB_LOAD(opts->plugin_configs[i]->path); if(!lib){ log__printf(NULL, MOSQ_LOG_ERR, - "Error: Unable to load plugin \"%s\".", opts->plugin_configs[i].path); + "Error: Unable to load plugin \"%s\".", opts->plugin_configs[i]->path); LIB_ERROR(); return MOSQ_ERR_UNKNOWN; } - opts->plugin_configs[i].plugin.lib = NULL; + opts->plugin_configs[i]->plugin.lib = NULL; if((plugin_version = (FUNC_plugin_version)LIB_SYM(lib, "mosquitto_plugin_version"))){ version = plugin_version(plugin_version_count, plugin_versions); }else if((plugin_auth_version = (FUNC_auth_plugin_version)LIB_SYM(lib, "mosquitto_auth_plugin_version"))){ @@ -88,26 +88,26 @@ static int security__module_init_single(struct mosquitto__listener *listener, st LIB_CLOSE(lib); return MOSQ_ERR_UNKNOWN; } - opts->plugin_configs[i].plugin.version = version; + opts->plugin_configs[i]->plugin.version = version; if(version == 5){ rc = plugin__load_v5( listener, - &opts->plugin_configs[i].plugin, - opts->plugin_configs[i].options, - opts->plugin_configs[i].option_count, + &opts->plugin_configs[i]->plugin, + opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, lib); if(rc){ return rc; } }else if(version == 4){ - rc = plugin__load_v4(listener, &opts->plugin_configs[i], lib); + rc = plugin__load_v4(listener, opts->plugin_configs[i], lib); if(rc) return rc; }else if(version == 3){ - rc = plugin__load_v3(listener, &opts->plugin_configs[i], lib); + rc = plugin__load_v3(listener, opts->plugin_configs[i], lib); if(rc) return rc; }else if(version == 2){ - rc = plugin__load_v2(listener, &opts->plugin_configs[i], lib); + rc = plugin__load_v2(listener, opts->plugin_configs[i], lib); if(rc) return rc; }else{ log__printf(NULL, MOSQ_LOG_ERR, @@ -148,7 +148,7 @@ static void security__module_cleanup_single(struct mosquitto__security_options * struct mosquitto__plugin_config *conf; for(i=0; iplugin_config_count; i++){ - conf = &opts->plugin_configs[i]; + conf = opts->plugin_configs[i]; /* Run plugin cleanup function */ if(conf->plugin.version == 5){ @@ -231,27 +231,27 @@ static int security__init_single(struct mosquitto__security_options *opts, bool } for(i=0; iplugin_config_count; i++){ - if(opts->plugin_configs[i].plugin.version == 5){ + if(opts->plugin_configs[i]->plugin.version == 5){ continue; - }else if(opts->plugin_configs[i].plugin.version == 4){ - rc = opts->plugin_configs[i].plugin.security_init_v4( - opts->plugin_configs[i].plugin.user_data, - opts->plugin_configs[i].options, - opts->plugin_configs[i].option_count, + }else if(opts->plugin_configs[i]->plugin.version == 4){ + rc = opts->plugin_configs[i]->plugin.security_init_v4( + opts->plugin_configs[i]->plugin.user_data, + opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, reload); - }else if(opts->plugin_configs[i].plugin.version == 3){ - rc = opts->plugin_configs[i].plugin.security_init_v3( - opts->plugin_configs[i].plugin.user_data, - opts->plugin_configs[i].options, - opts->plugin_configs[i].option_count, + }else if(opts->plugin_configs[i]->plugin.version == 3){ + rc = opts->plugin_configs[i]->plugin.security_init_v3( + opts->plugin_configs[i]->plugin.user_data, + opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, reload); - }else if(opts->plugin_configs[i].plugin.version == 2){ - rc = opts->plugin_configs[i].plugin.security_init_v2( - opts->plugin_configs[i].plugin.user_data, - (struct mosquitto_auth_opt *)opts->plugin_configs[i].options, - opts->plugin_configs[i].option_count, + }else if(opts->plugin_configs[i]->plugin.version == 2){ + rc = opts->plugin_configs[i]->plugin.security_init_v2( + opts->plugin_configs[i]->plugin.user_data, + (struct mosquitto_auth_opt *)opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, reload); }else{ rc = MOSQ_ERR_INVAL; @@ -300,27 +300,27 @@ static int security__cleanup_single(struct mosquitto__security_options *opts, bo int rc; for(i=0; iplugin_config_count; i++){ - if(opts->plugin_configs[i].plugin.version == 5){ + if(opts->plugin_configs[i]->plugin.version == 5){ rc = MOSQ_ERR_SUCCESS; - }else if(opts->plugin_configs[i].plugin.version == 4){ - rc = opts->plugin_configs[i].plugin.security_cleanup_v4( - opts->plugin_configs[i].plugin.user_data, - opts->plugin_configs[i].options, - opts->plugin_configs[i].option_count, + }else if(opts->plugin_configs[i]->plugin.version == 4){ + rc = opts->plugin_configs[i]->plugin.security_cleanup_v4( + opts->plugin_configs[i]->plugin.user_data, + opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, reload); - }else if(opts->plugin_configs[i].plugin.version == 3){ - rc = opts->plugin_configs[i].plugin.security_cleanup_v3( - opts->plugin_configs[i].plugin.user_data, - opts->plugin_configs[i].options, - opts->plugin_configs[i].option_count, + }else if(opts->plugin_configs[i]->plugin.version == 3){ + rc = opts->plugin_configs[i]->plugin.security_cleanup_v3( + opts->plugin_configs[i]->plugin.user_data, + opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, reload); - }else if(opts->plugin_configs[i].plugin.version == 2){ - rc = opts->plugin_configs[i].plugin.security_cleanup_v2( - opts->plugin_configs[i].plugin.user_data, - (struct mosquitto_auth_opt *)opts->plugin_configs[i].options, - opts->plugin_configs[i].option_count, + }else if(opts->plugin_configs[i]->plugin.version == 2){ + rc = opts->plugin_configs[i]->plugin.security_cleanup_v2( + opts->plugin_configs[i]->plugin.user_data, + (struct mosquitto_auth_opt *)opts->plugin_configs[i]->options, + opts->plugin_configs[i]->option_count, reload); }else{ rc = MOSQ_ERR_INVAL;