Only reinject stream if data is changed by rsub

This commit is contained in:
brenosilva 2011-06-15 14:38:42 +00:00
parent 3d69126de0
commit ad168c801d
3 changed files with 12 additions and 2 deletions

View File

@ -84,7 +84,7 @@ apr_status_t input_filter(ap_filter_t *f, apr_bucket_brigade *bb_out,
return APR_EGENERAL;
}
if (chunk && !msr->txcfg->stream_inbody_inspection) {
if (chunk && (!msr->txcfg->stream_inbody_inspection || msr->if_stream_changed == 0)) {
/* Copy the data we received in the chunk */
bucket = apr_bucket_heap_create(chunk->data, chunk->length, NULL,
f->r->connection->bucket_alloc);
@ -114,6 +114,9 @@ apr_status_t input_filter(ap_filter_t *f, apr_bucket_brigade *bb_out,
}
} else if (msr->stream_input_data != NULL) {
if(msr->if_stream_changed == 1)
msr->if_stream_changed = 0;
bucket = apr_bucket_heap_create(msr->stream_input_data, msr->stream_input_length, NULL,
f->r->connection->bucket_alloc);
@ -913,7 +916,10 @@ apr_status_t output_filter(ap_filter_t *f, apr_bucket_brigade *bb_in) {
* (full-buffering only).
*/
if ((msr->of_skipping == 0)&&(!msr->of_partial)) {
inject_content_to_of_brigade(msr,f);
if(msr->of_stream_changed == 1) {
inject_content_to_of_brigade(msr,f);
msr->of_stream_changed = 0;
}
prepend_content_to_of_brigade(msr, f);
/* Inject content into response (append & buffering). */

View File

@ -238,6 +238,8 @@ struct modsec_rec {
char *stream_input_data;
apr_size_t stream_output_length;
char *stream_output_data;
unsigned int of_stream_changed;
unsigned int if_stream_changed;
apr_array_header_t *error_messages;
apr_array_header_t *alerts;

View File

@ -442,6 +442,7 @@ static int msre_op_rsub_execute(modsec_rec *msr, msre_rule *rule, msre_var *var,
}
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);
@ -464,6 +465,7 @@ static int msre_op_rsub_execute(modsec_rec *msr, msre_rule *rule, msre_var *var,
msr->stream_input_data = (char *)stream_input_data;
if(msr->stream_input_data != NULL)
apr_cpystrn(msr->stream_input_data, data, size);
msr->if_stream_changed = 1;
}
if (! *error_msg) {