Fix potential memory corruption in msre_create_var_ex allocating per-request data out of global pool.

This commit is contained in:
brectanus 2007-03-08 16:15:45 +00:00
parent 8898759c47
commit ab55a8716e
4 changed files with 12 additions and 7 deletions

View File

@ -1,7 +1,9 @@
01 Mar 2007 - 2.1.1-dev1
01 Mar 2007 - 2.1.1-dev3
------------------------
* Fixed potential memory corruption when expanding macros.
* Fixed error when a collection var was fetched in the same second as creation
by setting the rate to zero.

View File

@ -121,10 +121,10 @@ msre_action_metadata *msre_resolve_action(msre_engine *engine, const char *name)
* Creates a new variable instance given the variable name
* and an (optional) parameter.
*/
msre_var *msre_create_var_ex(msre_engine *engine, const char *name, const char *param,
msre_var *msre_create_var_ex(apr_pool_t *pool, msre_engine *engine, const char *name, const char *param,
modsec_rec *msr, char **error_msg)
{
msre_var *var = apr_pcalloc(engine->mp, sizeof(msre_var));
msre_var *var = apr_pcalloc(pool, sizeof(msre_var));
if (var == NULL) return NULL;
if (error_msg == NULL) return NULL;
@ -147,7 +147,7 @@ msre_var *msre_create_var_ex(msre_engine *engine, const char *name, const char *
/* CGI HTTP variables emulation. */
if (strncasecmp(var->name, "HTTP_", 5) == 0) {
if (var->param != NULL) {
*error_msg = apr_psprintf(engine->mp, "Variable %s does not support parameters.",
*error_msg = apr_psprintf(pool, "Variable %s does not support parameters.",
var->name);
return NULL;
}
@ -196,11 +196,14 @@ msre_var *msre_create_var_ex(msre_engine *engine, const char *name, const char *
/**
* Create a new variable object from the provided name and value.
*
* NOTE: this allocates out of the global pool and should not be used
* per-request
*/
msre_var *msre_create_var(msre_ruleset *ruleset, const char *name, const char *param,
modsec_rec *msr, char **error_msg)
{
msre_var *var = msre_create_var_ex(ruleset->engine, name, param, msr, error_msg);
msre_var *var = msre_create_var_ex(ruleset->engine->mp, ruleset->engine, name, param, msr, error_msg);
if (var == NULL) return NULL;
/* Validate & initialise variable */

View File

@ -54,7 +54,7 @@ msre_action_metadata *msre_resolve_action(msre_engine *engine, const char *name)
msre_var *msre_create_var(msre_ruleset *ruleset, const char *name, const char *param,
modsec_rec *msr, char **error_msg);
msre_var *msre_create_var_ex(msre_engine *engine, const char *name, const char *param,
msre_var *msre_create_var_ex(apr_pool_t *pool, msre_engine *engine, const char *name, const char *param,
modsec_rec *msr, char **error_msg);
msre_action *msre_create_action(msre_engine *engine, const char *name,

View File

@ -131,7 +131,7 @@ int DSOLOCAL expand_macros(modsec_rec *msr, msc_string *var, msre_rule *rule, ap
*(msc_string **)apr_array_push(arr) = part;
/* Resolve the macro and add that to the array. */
var_resolved = msre_create_var_ex(msr->modsecurity->msre, var_name, var_value,
var_resolved = msre_create_var_ex(mptmp, msr->modsecurity->msre, var_name, var_value,
msr, &my_error_msg);
if (var_resolved != NULL) {
var_generated = generate_single_var(msr, var_resolved, rule, mptmp);