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:
Markus Makela 2016-02-23 21:35:45 +02:00
parent aec1310c52
commit cb2e3b898e
5 changed files with 115 additions and 62 deletions

View File

@ -43,11 +43,11 @@ anymore and the `filebase` parameter should be used instead.
## Filter Parameters
The QLA filter accepts a number of optional parameters, these were introduced in the 1.0 release of MaxScale.
The QLA filter has one mandatory parameter, `filebase`, and a number of optional parameters. These were introduced in the 1.0 release of MaxScale.
### Filebase
The basename of the output file created for each session. A session index is added to the filename for each file written.
The basename of the output file created for each session. A session index is added to the filename for each file written. This is a mandatory parameter.
```
filebase=/tmp/SqlQueryLog

View File

@ -40,11 +40,11 @@ options=case,extended
## Filter Parameters
The top filter accepts a number of optional parameters.
The top filter has one mandatory parameter, `filebase`, and a number of optional parameters.
### Filebase
The basename of the output file created for each session. A session index is added to the filename for each file written.
The basename of the output file created for each session. A session index is added to the filename for each file written. This is a mandatory parameter.
```
filebase=/tmp/SqlQueryLog

View File

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

View File

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

View File

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