From 4d82d4f6ea9fe74fd05615b9486af79725d6e8bd Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Sat, 9 Sep 2017 17:42:08 +0200 Subject: [PATCH] double free if plugin load failed --- apps/backend/backend_plugin.c | 75 ++++++++++++++++++----------------- lib/src/clixon_xml_db.c | 1 - 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/apps/backend/backend_plugin.c b/apps/backend/backend_plugin.c index 9bb6b131..6c837513 100644 --- a/apps/backend/backend_plugin.c +++ b/apps/backend/backend_plugin.c @@ -115,8 +115,8 @@ struct plugin { /* * Local variables */ -static int nplugins = 0; -static struct plugin *plugins = NULL; +static int _nplugins = 0; +static struct plugin *_plugins = NULL; /*! Find a plugin by name and return the dlsym handl * Used by libclicon code to find callback funcctions in plugins. @@ -132,8 +132,8 @@ config_find_plugin(clicon_handle h, int i; struct plugin *p; - for (i = 0; i < nplugins; i++){ - p = &plugins[i]; + for (i = 0; i < _nplugins; i++){ + p = &_plugins[i]; if (strcmp(p->p_name, name) == 0) return p->p_handle; } @@ -260,8 +260,8 @@ plugin_reset_state(clicon_handle h, struct plugin *p; - for (i = 0; i < nplugins; i++) { - p = &plugins[i]; + for (i = 0; i < _nplugins; i++) { + p = &_plugins[i]; if (p->p_reset) { clicon_debug(1, "Calling plugin_reset() for %s\n", p->p_name); @@ -290,8 +290,8 @@ plugin_start_hooks(clicon_handle h, int i; struct plugin *p; - for (i = 0; i < nplugins; i++) { - p = &plugins[i]; + for (i = 0; i < _nplugins; i++) { + p = &_plugins[i]; if (p->p_start) { optind = 0; if (((p->p_start)(h, argc, argv)) < 0) { @@ -314,15 +314,15 @@ plugin_append(struct plugin *p) { struct plugin *new; - if ((new = realloc(plugins, (nplugins+1) * sizeof (*p))) == NULL) { + if ((new = realloc(_plugins, (_nplugins+1) * sizeof (*p))) == NULL) { clicon_err(OE_UNIX, errno, "realloc"); return -1; } - memset (&new[nplugins], 0, sizeof(new[nplugins])); - memcpy (&new[nplugins], p, sizeof(new[nplugins])); - plugins = new; - nplugins++; + memset (&new[_nplugins], 0, sizeof(new[_nplugins])); + memcpy (&new[_nplugins], p, sizeof(new[_nplugins])); + _plugins = new; + _nplugins++; return 0; } @@ -400,14 +400,15 @@ backend_plugin_load_dir(clicon_handle h, quit: if (retval != 0) { /* XXX p is always NULL */ - if (plugins) { + if (_plugins) { while (--np >= 0){ - if ((p = &plugins[np]) == NULL) + if ((p = &_plugins[np]) == NULL) continue; backend_plugin_unload(h, p); free(p); } - free(plugins); + free(_plugins); + _plugins=0; } } if (dp) @@ -452,15 +453,15 @@ plugin_finish(clicon_handle h) int i; struct plugin *p; - for (i = 0; i < nplugins; i++) { - p = &plugins[i]; + for (i = 0; i < _nplugins; i++) { + p = &_plugins[i]; backend_plugin_unload(h, p); } - if (plugins){ - free(plugins); - plugins = NULL; + if (_plugins){ + free(_plugins); + _plugins = NULL; } - nplugins = 0; + _nplugins = 0; return 0; } @@ -516,8 +517,8 @@ plugin_transaction_begin(clicon_handle h, int retval = 0; struct plugin *p; - for (i = 0; i < nplugins; i++) { - p = &plugins[i]; + for (i = 0; i < _nplugins; i++) { + p = &_plugins[i]; if (p->p_trans_begin) if ((retval = (p->p_trans_begin)(h, (transaction_data)td)) < 0){ if (!clicon_errno) /* sanity: log if clicon_err() is not called ! */ @@ -546,8 +547,8 @@ plugin_transaction_validate(clicon_handle h, struct plugin *p; - for (i = 0; i < nplugins; i++){ - p = &plugins[i]; + for (i = 0; i < _nplugins; i++){ + p = &_plugins[i]; if (p->p_trans_validate) if ((retval = (p->p_trans_validate)(h, (transaction_data)td)) < 0){ if (!clicon_errno) /* sanity: log if clicon_err() is not called ! */ @@ -576,8 +577,8 @@ plugin_transaction_complete(clicon_handle h, int retval = 0; struct plugin *p; - for (i = 0; i < nplugins; i++){ - p = &plugins[i]; + for (i = 0; i < _nplugins; i++){ + p = &_plugins[i]; if (p->p_trans_complete) if ((retval = (p->p_trans_complete)(h, (transaction_data)td)) < 0){ if (!clicon_errno) /* sanity: log if clicon_err() is not called ! */ @@ -623,7 +624,7 @@ plugin_transaction_revert(clicon_handle h, tr.td_tcvec = td->td_scvec; for (i = nr-1; i>=0; i--){ - p = &plugins[i]; + p = &_plugins[i]; if (p->p_trans_commit) if ((p->p_trans_commit)(h, (transaction_data)&tr) < 0){ clicon_log(LOG_NOTICE, "Plugin '%s' %s revert callback failed", @@ -651,8 +652,8 @@ plugin_transaction_commit(clicon_handle h, int i; struct plugin *p; - for (i = 0; i < nplugins; i++){ - p = &plugins[i]; + for (i = 0; i < _nplugins; i++){ + p = &_plugins[i]; if (p->p_trans_commit) if ((retval = (p->p_trans_commit)(h, (transaction_data)td)) < 0){ if (!clicon_errno) /* sanity: log if clicon_err() is not called ! */ @@ -680,8 +681,8 @@ plugin_transaction_end(clicon_handle h, int i; struct plugin *p; - for (i = 0; i < nplugins; i++) { - p = &plugins[i]; + for (i = 0; i < _nplugins; i++) { + p = &_plugins[i]; if (p->p_trans_end) if ((retval = (p->p_trans_end)(h, (transaction_data)td)) < 0){ if (!clicon_errno) /* sanity: log if clicon_err() is not called ! */ @@ -708,8 +709,8 @@ plugin_transaction_abort(clicon_handle h, int i; struct plugin *p; - for (i = 0; i < nplugins; i++) { - p = &plugins[i]; + for (i = 0; i < _nplugins; i++) { + p = &_plugins[i]; if (p->p_trans_abort) (p->p_trans_abort)(h, (transaction_data)td); /* dont abort on error */ } @@ -750,8 +751,8 @@ backend_statedata_call(clicon_handle h, clicon_err(OE_CFG, ENOENT, "XML tree expected"); goto done; } - for (i = 0; i < nplugins; i++) { - p = &plugins[i]; + for (i = 0; i < _nplugins; i++) { + p = &_plugins[i]; if (p->p_statedata) { if ((x = xml_new("config", NULL)) == NULL) goto done; diff --git a/lib/src/clixon_xml_db.c b/lib/src/clixon_xml_db.c index 19b2e12e..d0f096df 100644 --- a/lib/src/clixon_xml_db.c +++ b/lib/src/clixon_xml_db.c @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include