diff --git a/apache2/msc_util.h b/apache2/msc_util.h index 546d0a8f..40f225c0 100644 --- a/apache2/msc_util.h +++ b/apache2/msc_util.h @@ -45,6 +45,8 @@ int DSOLOCAL remove_lf_crlf_inplace(char *text); unsigned char DSOLOCAL x2c(unsigned char *what); +unsigned char DSOLOCAL xsingle2c(unsigned char *what); + char DSOLOCAL *guess_tmp_dir(apr_pool_t *p); char DSOLOCAL *current_logtime(apr_pool_t *mp); @@ -90,4 +92,6 @@ int DSOLOCAL is_empty_string(const char *string); char DSOLOCAL *resolve_relative_path(apr_pool_t *pool, const char *parent_filename, const char *filename); +int DSOLOCAL css_decode_inplace(unsigned char *input, long int input_len); + #endif diff --git a/apache2/re_tfns.c b/apache2/re_tfns.c index 372c0de9..bf3d2b6c 100644 --- a/apache2/re_tfns.c +++ b/apache2/re_tfns.c @@ -198,6 +198,20 @@ static int msre_fn_compressWhitespace_execute(apr_pool_t *mptmp, unsigned char * return changed; } +/* cssDecode */ + +static int msre_fn_cssDecode_execute(apr_pool_t *mptmp, unsigned char *input, + long int input_len, char **rval, long int *rval_len) +{ + long int length; + + length = css_decode_inplace(input, input_len); + *rval = (char *)input; + *rval_len = length; + + return (*rval_len == input_len ? 0 : 1); +} + /* removeWhitespace */ static int msre_fn_removeWhitespace_execute(apr_pool_t *mptmp, unsigned char *input, @@ -612,6 +626,12 @@ void msre_engine_register_default_tfns(msre_engine *engine) { msre_fn_compressWhitespace_execute ); + /* cssDecode */ + msre_engine_tfn_register(engine, + "cssDecode", + msre_fn_cssDecode_execute + ); + /* escapeSeqDecode */ msre_engine_tfn_register(engine, "escapeSeqDecode",