MODSEC-249

This commit is contained in:
brenosilva 2011-08-31 16:53:11 +00:00
parent d43c7e0bf5
commit b0e9468d6e
2 changed files with 36 additions and 12 deletions

View File

@ -164,7 +164,11 @@ struct msre_rule {
msc_script *script;
#endif
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0
ap_regex_t *sub_regex;
#else
regex_t *sub_regex;
#endif
char *sub_str;
char *re_str;
int re_precomp;

View File

@ -21,7 +21,6 @@
#include "acmp.h"
#include "msc_util.h"
#if !defined(WIN32) || !defined(WINNT)
#include <regex.h>
#include <arpa/inet.h>
#endif
@ -213,7 +212,11 @@ static char *param_remove_escape(msre_rule *rule, char *str, int len) {
*/
#if !defined(MSC_TEST)
static int msre_op_rsub_param_init(msre_rule *rule, char **error_msg) {
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0
ap_regex_t *regex;
#else
regex_t *regex;
#endif
const char *pattern = NULL;
const char *line = NULL;
char *reg_pattern = NULL;
@ -309,8 +312,13 @@ static int msre_op_rsub_param_init(msre_rule *rule, char **error_msg) {
pattern = apr_pstrndup(rule->ruleset->mp, e_pattern, strlen(e_pattern));
if(strstr(pattern,"%{") == NULL) {
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0
regex = ap_pregcomp(rule->ruleset->mp, pattern, AP_REG_EXTENDED |
(ignore_case ? AP_REG_ICASE : 0));
#else
regex = ap_pregcomp(rule->ruleset->mp, pattern, REG_EXTENDED |
(ignore_case ? REG_ICASE : 0));
#endif
rule->sub_regex = regex;
} else {
rule->re_precomp = 1;
@ -342,7 +350,11 @@ static int msre_op_rsub_execute(modsec_rec *msr, msre_rule *rule, msre_var *var,
char *data = NULL, *pattern = NULL;
unsigned int size = var->value_len;
int output_body = 0, input_body = 0, count = 0;
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0
ap_regmatch_t pmatch[AP_MAX_REG_MATCH];
#else
regmatch_t pmatch[AP_MAX_REG_MATCH];
#endif
if (error_msg == NULL) return -1;
*error_msg = NULL;
@ -367,12 +379,20 @@ static int msre_op_rsub_execute(modsec_rec *msr, msre_rule *rule, msre_var *var,
if (msr->txcfg->debuglog_level >= 6) {
msr_log(msr, 6, "Escaping pattern [%s]",pattern);
}
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0
rule->sub_regex = ap_pregcomp(msr->mp, pattern, AP_REG_EXTENDED);
#else
rule->sub_regex = ap_pregcomp(msr->mp, pattern, REG_EXTENDED);
#endif
} else {
#if AP_SERVER_MAJORVERSION_NUMBER > 1 && AP_SERVER_MINORVERSION_NUMBER > 0
rule->sub_regex = ap_pregcomp(msr->mp, re_pattern->value, AP_REG_EXTENDED);
#else
rule->sub_regex = ap_pregcomp(msr->mp, re_pattern->value, REG_EXTENDED);
#endif
}
}
else {
} else {
rule->sub_regex = NULL;
}
@ -387,7 +407,7 @@ static int msre_op_rsub_execute(modsec_rec *msr, msre_rule *rule, msre_var *var,
str->value_len = strlen(str->value);
if(strstr(rule->sub_str,"%{") != NULL)
expand_macros(msr, str, rule, msr->mp);
expand_macros(msr, str, rule, msr->mp);
replace = apr_pstrndup(msr->mp, str->value, str->value_len);
data = apr_pcalloc(msr->mp, var->value_len+(AP_MAX_REG_MATCH*strlen(replace))+1);
@ -436,16 +456,16 @@ static int msre_op_rsub_execute(modsec_rec *msr, msre_rule *rule, msre_var *var,
msr->stream_output_length = size;
if(stream_output_data == NULL) {
free (msr->stream_output_data);
msr->stream_output_data = NULL;
return -1;
free (msr->stream_output_data);
msr->stream_output_data = NULL;
return -1;
}
var->value_len = size;
msr->of_stream_changed = 1;
msr->stream_output_data = (char *)stream_output_data;
if(msr->stream_output_data != NULL)
apr_cpystrn(msr->stream_output_data, data, size);
apr_cpystrn(msr->stream_output_data, data, size);
}
@ -456,15 +476,15 @@ static int msre_op_rsub_execute(modsec_rec *msr, msre_rule *rule, msre_var *var,
msr->stream_input_length = size;
if(stream_input_data == NULL) {
free (msr->stream_input_data);
msr->stream_input_data = NULL;
return -1;
free (msr->stream_input_data);
msr->stream_input_data = NULL;
return -1;
}
var->value_len = size;
msr->stream_input_data = (char *)stream_input_data;
if(msr->stream_input_data != NULL)
apr_cpystrn(msr->stream_input_data, data, size);
apr_cpystrn(msr->stream_input_data, data, size);
msr->if_stream_changed = 1;
}