Cleaned up qlafilter, topfilter and namedserverfilter instance creation
The change fixes a crash when no filebase parameter is given for the filter. The instance creation functions of these filters had spossible memory leaks in case errors in the configuration occurred. In addition to these, they would be successfully created even if unexpected parameters were given.
This commit is contained in:
@ -85,7 +85,6 @@ typedef struct
|
||||
char *user; /* User name to restrict matches */
|
||||
char *match; /* Regular expression to match */
|
||||
char *server; /* Server to route to */
|
||||
int cflags; /* Regexec compile flags */
|
||||
regex_t re; /* Compiled regex text */
|
||||
} REGEXHINT_INSTANCE;
|
||||
|
||||
@ -147,14 +146,17 @@ static FILTER *
|
||||
createInstance(char **options, FILTER_PARAMETER **params)
|
||||
{
|
||||
REGEXHINT_INSTANCE *my_instance;
|
||||
int i, cflags = REG_ICASE;
|
||||
int cflags = REG_ICASE;
|
||||
|
||||
if ((my_instance = calloc(1, sizeof(REGEXHINT_INSTANCE))) != NULL)
|
||||
if ((my_instance = malloc(sizeof(REGEXHINT_INSTANCE))) != NULL)
|
||||
{
|
||||
my_instance->match = NULL;
|
||||
my_instance->server = NULL;
|
||||
my_instance->source = NULL;
|
||||
my_instance->user = NULL;
|
||||
bool error = false;
|
||||
|
||||
for (i = 0; params && params[i]; i++)
|
||||
for (int i = 0; params && params[i]; i++)
|
||||
{
|
||||
if (!strcmp(params[i]->name, "match"))
|
||||
{
|
||||
@ -176,12 +178,13 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
||||
{
|
||||
MXS_ERROR("namedserverfilter: Unexpected parameter '%s'.",
|
||||
params[i]->name);
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (options)
|
||||
{
|
||||
for (i = 0; options[i]; i++)
|
||||
for (int i = 0; options[i]; i++)
|
||||
{
|
||||
if (!strcasecmp(options[i], "ignorecase"))
|
||||
{
|
||||
@ -197,32 +200,48 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_ERROR("namedserverfilter: unsupported option '%s'.",
|
||||
MXS_ERROR("namedserverfilter: Unsupported option '%s'.",
|
||||
options[i]);
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
my_instance->cflags = cflags;
|
||||
|
||||
if (my_instance->match == NULL || my_instance->server == NULL)
|
||||
if (my_instance->match == NULL)
|
||||
{
|
||||
MXS_ERROR("namedserverfilter: Missing required configured"
|
||||
" option. You must specify a match and server "
|
||||
"option as a minimum.");
|
||||
free(my_instance);
|
||||
return NULL;
|
||||
MXS_ERROR("namedserverfilter: Missing required parameters 'match'.");
|
||||
error = true;
|
||||
}
|
||||
|
||||
if (regcomp(&my_instance->re, my_instance->match,
|
||||
my_instance->cflags))
|
||||
if (my_instance->server == NULL)
|
||||
{
|
||||
MXS_ERROR("namedserverfilter: Missing required parameters 'server'.");
|
||||
error = true;
|
||||
}
|
||||
if (my_instance->server && my_instance->match &&
|
||||
regcomp(&my_instance->re, my_instance->match, cflags))
|
||||
{
|
||||
MXS_ERROR("namedserverfilter: Invalid regular expression '%s'.\n",
|
||||
my_instance->match);
|
||||
free(my_instance->match);
|
||||
free(my_instance->server);
|
||||
free(my_instance);
|
||||
return NULL;
|
||||
my_instance->match = NULL;
|
||||
error = true;
|
||||
}
|
||||
|
||||
if (error)
|
||||
{
|
||||
if (my_instance->match)
|
||||
{
|
||||
regfree(&my_instance->re);
|
||||
free(my_instance->match);
|
||||
}
|
||||
free(my_instance->server);
|
||||
free(my_instance->source);
|
||||
free(my_instance->user);
|
||||
free(my_instance);
|
||||
my_instance = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
return(FILTER *) my_instance;
|
||||
}
|
||||
|
@ -175,12 +175,15 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
||||
QLA_INSTANCE *my_instance;
|
||||
int i;
|
||||
|
||||
if ((my_instance = calloc(1, sizeof(QLA_INSTANCE))) != NULL)
|
||||
if ((my_instance = malloc(sizeof(QLA_INSTANCE))) != NULL)
|
||||
{
|
||||
my_instance->source = NULL;
|
||||
my_instance->userName = NULL;
|
||||
my_instance->match = NULL;
|
||||
my_instance->nomatch = NULL;
|
||||
my_instance->filebase = NULL;
|
||||
bool error = false;
|
||||
|
||||
if (params)
|
||||
{
|
||||
for (i = 0; params[i]; i++)
|
||||
@ -203,17 +206,13 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
||||
}
|
||||
else if (!strcmp(params[i]->name, "filebase"))
|
||||
{
|
||||
if (my_instance->filebase)
|
||||
{
|
||||
free(my_instance->filebase);
|
||||
my_instance->filebase = NULL;
|
||||
}
|
||||
my_instance->filebase = strdup(params[i]->value);
|
||||
}
|
||||
else if (!filter_standard_parameter(params[i]->name))
|
||||
{
|
||||
MXS_ERROR("qlafilter: Unexpected parameter '%s'.",
|
||||
params[i]->name);
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -238,46 +237,59 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_ERROR("qlafilter: unsupported option '%s'.",
|
||||
MXS_ERROR("qlafilter: Unsupported option '%s'.",
|
||||
options[i]);
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (my_instance->filebase == NULL)
|
||||
{
|
||||
MXS_ERROR("qlafilter: No 'filebase' parameter defined.");
|
||||
error = true;
|
||||
}
|
||||
|
||||
my_instance->sessions = 0;
|
||||
if (my_instance->match &&
|
||||
regcomp(&my_instance->re, my_instance->match, cflags))
|
||||
{
|
||||
MXS_ERROR("qlafilter: Invalid regular expression '%s'"
|
||||
" for the match parameter.\n",
|
||||
" for the 'match' parameter.\n",
|
||||
my_instance->match);
|
||||
free(my_instance->match);
|
||||
free(my_instance->source);
|
||||
if (my_instance->filebase)
|
||||
{
|
||||
free(my_instance->filebase);
|
||||
}
|
||||
free(my_instance);
|
||||
return NULL;
|
||||
my_instance->match = NULL;
|
||||
error = true;
|
||||
}
|
||||
if (my_instance->nomatch &&
|
||||
regcomp(&my_instance->nore, my_instance->nomatch, cflags))
|
||||
{
|
||||
MXS_ERROR("qlafilter: Invalid regular expression '%s'"
|
||||
" for the nomatch paramter.",
|
||||
my_instance->match);
|
||||
" for the 'nomatch' parameter.",
|
||||
my_instance->nomatch);
|
||||
free(my_instance->nomatch);
|
||||
my_instance->nomatch = NULL;
|
||||
error = true;
|
||||
}
|
||||
|
||||
if (error)
|
||||
{
|
||||
if (my_instance->match)
|
||||
{
|
||||
free(my_instance->match);
|
||||
regfree(&my_instance->re);
|
||||
}
|
||||
free(my_instance->match);
|
||||
free(my_instance->source);
|
||||
if (my_instance->filebase)
|
||||
|
||||
if (my_instance->match)
|
||||
{
|
||||
free(my_instance->filebase);
|
||||
free(my_instance->match);
|
||||
regfree(&my_instance->re);
|
||||
}
|
||||
free(my_instance->filebase);
|
||||
free(my_instance->source);
|
||||
free(my_instance->userName);
|
||||
free(my_instance);
|
||||
return NULL;
|
||||
my_instance = NULL;
|
||||
}
|
||||
}
|
||||
return(FILTER *) my_instance;
|
||||
|
@ -176,7 +176,6 @@ GetModuleObject()
|
||||
{
|
||||
return &MyObject;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an instance of the filter for a particular service
|
||||
* within MaxScale.
|
||||
@ -192,14 +191,16 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
||||
int i;
|
||||
TOPN_INSTANCE *my_instance;
|
||||
|
||||
if ((my_instance = calloc(1, sizeof(TOPN_INSTANCE))) != NULL)
|
||||
if ((my_instance = malloc(sizeof(TOPN_INSTANCE))) != NULL)
|
||||
{
|
||||
my_instance->topN = 10;
|
||||
my_instance->match = NULL;
|
||||
my_instance->exclude = NULL;
|
||||
my_instance->source = NULL;
|
||||
my_instance->user = NULL;
|
||||
my_instance->filebase = strdup("top");
|
||||
my_instance->filebase = NULL;
|
||||
bool error = false;
|
||||
|
||||
for (i = 0; params && params[i]; i++)
|
||||
{
|
||||
if (!strcmp(params[i]->name, "count"))
|
||||
@ -208,7 +209,6 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
||||
}
|
||||
else if (!strcmp(params[i]->name, "filebase"))
|
||||
{
|
||||
free(my_instance->filebase);
|
||||
my_instance->filebase = strdup(params[i]->value);
|
||||
}
|
||||
else if (!strcmp(params[i]->name, "match"))
|
||||
@ -231,6 +231,7 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
||||
{
|
||||
MXS_ERROR("topfilter: Unexpected parameter '%s'.",
|
||||
params[i]->name);
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
|
||||
@ -254,39 +255,60 @@ createInstance(char **options, FILTER_PARAMETER **params)
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_ERROR("topfilter: unsupported option '%s'.",
|
||||
MXS_ERROR("topfilter: Unsupported option '%s'.",
|
||||
options[i]);
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (my_instance->filebase == NULL)
|
||||
{
|
||||
MXS_ERROR("topfilter: No 'filebase' parameter defined.");
|
||||
error = true;
|
||||
}
|
||||
|
||||
my_instance->sessions = 0;
|
||||
if (my_instance->match &&
|
||||
regcomp(&my_instance->re, my_instance->match, cflags))
|
||||
{
|
||||
MXS_ERROR("topfilter: Invalid regular expression '%s'"
|
||||
" for the match parameter.",
|
||||
" for the 'match' parameter.",
|
||||
my_instance->match);
|
||||
regfree(&my_instance->re);
|
||||
free(my_instance->match);
|
||||
free(my_instance->source);
|
||||
free(my_instance->user);
|
||||
free(my_instance->filebase);
|
||||
free(my_instance);
|
||||
return NULL;
|
||||
my_instance->match = NULL;
|
||||
error = true;
|
||||
}
|
||||
if (my_instance->exclude &&
|
||||
regcomp(&my_instance->exre, my_instance->exclude, cflags))
|
||||
{
|
||||
MXS_ERROR("qlafilter: Invalid regular expression '%s'"
|
||||
" for the nomatch paramter.\n",
|
||||
my_instance->match);
|
||||
regfree(&my_instance->re);
|
||||
free(my_instance->match);
|
||||
MXS_ERROR("topfilter: Invalid regular expression '%s'"
|
||||
" for the 'nomatch' parameter.\n",
|
||||
my_instance->exclude);
|
||||
regfree(&my_instance->exre);
|
||||
free(my_instance->exclude);
|
||||
my_instance->exclude = NULL;
|
||||
error = true;
|
||||
}
|
||||
|
||||
if (error)
|
||||
{
|
||||
if (my_instance->exclude)
|
||||
{
|
||||
regfree(&my_instance->exre);
|
||||
free(my_instance->exclude);
|
||||
}
|
||||
if (my_instance->match)
|
||||
{
|
||||
regfree(&my_instance->re);
|
||||
free(my_instance->match);
|
||||
}
|
||||
free(my_instance->filebase);
|
||||
free(my_instance->source);
|
||||
free(my_instance->user);
|
||||
free(my_instance->filebase);
|
||||
free(my_instance);
|
||||
return NULL;
|
||||
my_instance = NULL;
|
||||
}
|
||||
}
|
||||
return(FILTER *) my_instance;
|
||||
|
Reference in New Issue
Block a user