double free if plugin load failed
This commit is contained in:
parent
ef0fce10d5
commit
4d82d4f6ea
2 changed files with 38 additions and 38 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@
|
|||
#include <dlfcn.h>
|
||||
#include <fcntl.h>
|
||||
#include <time.h>
|
||||
#include <fcgi_stdio.h>
|
||||
#include <signal.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/wait.h>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue