in apache2/msc_crypt.c [343:662]
int do_hash_method(modsec_rec *msr, char *link, int type) {
hash_method **em = NULL;
int i = 0;
char *error_msg = NULL;
char *my_error_msg = NULL;
int ovector[33];
int rc;
if(msr == NULL) return -1;
em = (hash_method **)msr->txcfg->hash_method->elts;
if(msr->txcfg->hash_method->nelts == 0)
return 1;
for (i = 0; i < msr->txcfg->hash_method->nelts; i++) {
if(em[i] != NULL && em[i]->param_data != NULL){
switch(type) {
case HASH_URL_HREF_HASH_PM:
if(em[i]->type == HASH_URL_HREF_HASH_PM) {
const char *match = NULL;
apr_status_t rc = 0;
ACMPT pt;
pt.parser = (ACMP *)em[i]->param_data;
pt.ptr = NULL;
rc = acmp_process_quick(&pt, &match, link, strlen(link));
if (rc) {
return 1;
} else {
return 0;
}
}
break;
case HASH_URL_HREF_HASH_RX:
if(em[i]->type == HASH_URL_HREF_HASH_RX) {
rc = msc_regexec_capture(em[i]->param_data, link, strlen(link), ovector, 30, &my_error_msg);
if ((rc == PCRE_ERROR_MATCHLIMIT) || (rc == PCRE_ERROR_RECURSIONLIMIT)) {
msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
if (s == NULL) return -1;
s->name = apr_pstrdup(msr->mp, "MSC_PCRE_LIMITS_EXCEEDED");
if (s->name == NULL) return -1;
s->name_len = strlen(s->name);
s->value = apr_pstrdup(msr->mp, "1");
if (s->value == NULL) return -1;
s->value_len = 1;
apr_table_setn(msr->tx_vars, s->name, (void *)s);
error_msg = apr_psprintf(msr->mp,
"Execution error - "
"PCRE limits exceeded for Hash regex [%s] (%d): %s",
em[i]->param,rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
#ifdef WAF_JSON_LOGGING_ENABLE
msr_log_with_errorcode(msr, 4, 1, "%s.", error_msg);
#else
msr_log(msr, 4, "%s.", error_msg);
#endif
return 0; /* No match. */
}
else if (rc < -1) {
error_msg = apr_psprintf(msr->mp, "Regex execution failed (%d): %s",
rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
msr_log(msr, 4, "%s.", error_msg);
return -1;
}
if (rc != PCRE_ERROR_NOMATCH) { /* Match. */
return 1;
}
}
break;
case HASH_URL_FACTION_HASH_PM:
if(em[i]->type == HASH_URL_FACTION_HASH_PM) {
const char *match = NULL;
apr_status_t rc = 0;
ACMPT pt;
pt.parser = (ACMP *)em[i]->param_data;
pt.ptr = NULL;
rc = acmp_process_quick(&pt, &match, link, strlen(link));
if (rc) {
return 1;
} else {
return 0;
}
}
break;
case HASH_URL_FACTION_HASH_RX:
if(em[i]->type == HASH_URL_FACTION_HASH_RX) {
rc = msc_regexec_capture(em[i]->param_data, link, strlen(link), ovector, 30, &my_error_msg);
if ((rc == PCRE_ERROR_MATCHLIMIT) || (rc == PCRE_ERROR_RECURSIONLIMIT)) {
msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
if (s == NULL) return -1;
s->name = apr_pstrdup(msr->mp, "MSC_PCRE_LIMITS_EXCEEDED");
if (s->name == NULL) return -1;
s->name_len = strlen(s->name);
s->value = apr_pstrdup(msr->mp, "1");
if (s->value == NULL) return -1;
s->value_len = 1;
apr_table_setn(msr->tx_vars, s->name, (void *)s);
error_msg = apr_psprintf(msr->mp,
"Execution error - "
"PCRE limits exceeded for Hash regex [%s] (%d): %s",
em[i]->param,rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
#ifdef WAF_JSON_LOGGING_ENABLE
msr_log_with_errorcode(msr, 4, 1, "%s.", error_msg);
#else
msr_log(msr, 4, "%s.", error_msg);
#endif
return 0; /* No match. */
}
else if (rc < -1) {
error_msg = apr_psprintf(msr->mp, "Regex execution failed (%d): %s",
rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
msr_log(msr, 4, "%s.", error_msg);
return -1;
}
if (rc != PCRE_ERROR_NOMATCH) { /* Match. */
return 1;
}
}
break;
case HASH_URL_LOCATION_HASH_PM:
if(em[i]->type == HASH_URL_LOCATION_HASH_PM) {
const char *match = NULL;
apr_status_t rc = 0;
ACMPT pt;
pt.parser = (ACMP *)em[i]->param_data;
pt.ptr = NULL;
rc = acmp_process_quick(&pt, &match, link, strlen(link));
if (rc) {
return 1;
} else {
return 0;
}
}
break;
case HASH_URL_LOCATION_HASH_RX:
if(em[i]->type == HASH_URL_LOCATION_HASH_RX) {
rc = msc_regexec_capture(em[i]->param_data, link, strlen(link), ovector, 30, &my_error_msg);
if ((rc == PCRE_ERROR_MATCHLIMIT) || (rc == PCRE_ERROR_RECURSIONLIMIT)) {
msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
if (s == NULL) return -1;
s->name = apr_pstrdup(msr->mp, "MSC_PCRE_LIMITS_EXCEEDED");
if (s->name == NULL) return -1;
s->name_len = strlen(s->name);
s->value = apr_pstrdup(msr->mp, "1");
if (s->value == NULL) return -1;
s->value_len = 1;
apr_table_setn(msr->tx_vars, s->name, (void *)s);
error_msg = apr_psprintf(msr->mp,
"Execution error - "
"PCRE limits exceeded for Hash regex [%s] (%d): %s",
em[i]->param,rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
#ifdef WAF_JSON_LOGGING_ENABLE
msr_log_with_errorcode(msr, 4, 1, "%s.", error_msg);
#else
msr_log(msr, 4, "%s.", error_msg);
#endif
return 0; /* No match. */
}
else if (rc < -1) {
error_msg = apr_psprintf(msr->mp, "Regex execution failed (%d): %s",
rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
msr_log(msr, 4, "%s.", error_msg);
return -1;
}
if (rc != PCRE_ERROR_NOMATCH) { /* Match. */
return 1;
}
}
break;
case HASH_URL_IFRAMESRC_HASH_PM:
if(em[i]->type == HASH_URL_IFRAMESRC_HASH_PM) {
const char *match = NULL;
apr_status_t rc = 0;
ACMPT pt;
pt.parser = (ACMP *)em[i]->param_data;
pt.ptr = NULL;
rc = acmp_process_quick(&pt, &match, link, strlen(link));
if (rc) {
return 1;
} else {
return 0;
}
}
break;
case HASH_URL_IFRAMESRC_HASH_RX:
if(em[i]->type == HASH_URL_IFRAMESRC_HASH_RX) {
rc = msc_regexec_capture(em[i]->param_data, link, strlen(link), ovector, 30, &my_error_msg);
if ((rc == PCRE_ERROR_MATCHLIMIT) || (rc == PCRE_ERROR_RECURSIONLIMIT)) {
msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
if (s == NULL) return -1;
s->name = apr_pstrdup(msr->mp, "MSC_PCRE_LIMITS_EXCEEDED");
if (s->name == NULL) return -1;
s->name_len = strlen(s->name);
s->value = apr_pstrdup(msr->mp, "1");
if (s->value == NULL) return -1;
s->value_len = 1;
apr_table_setn(msr->tx_vars, s->name, (void *)s);
error_msg = apr_psprintf(msr->mp,
"Execution error - "
"PCRE limits exceeded for Hash regex [%s] (%d): %s",
em[i]->param,rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
#ifdef WAF_JSON_LOGGING_ENABLE
msr_log_with_errorcode(msr, 4, 1, "%s.", error_msg);
#else
msr_log(msr, 4, "%s.", error_msg);
#endif
return 0; /* No match. */
}
else if (rc < -1) {
error_msg = apr_psprintf(msr->mp, "Regex execution failed (%d): %s",
rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
msr_log(msr, 4, "%s.", error_msg);
return -1;
}
if (rc != PCRE_ERROR_NOMATCH) { /* Match. */
return 1;
}
}
break;
case HASH_URL_FRAMESRC_HASH_PM:
if(em[i]->type == HASH_URL_FRAMESRC_HASH_PM) {
const char *match = NULL;
apr_status_t rc = 0;
ACMPT pt;
pt.parser = (ACMP *)em[i]->param_data;
pt.ptr = NULL;
rc = acmp_process_quick(&pt, &match, link, strlen(link));
if (rc) {
return 1;
} else {
return 0;
}
}
break;
case HASH_URL_FRAMESRC_HASH_RX:
if(em[i]->type == HASH_URL_FRAMESRC_HASH_RX) {
rc = msc_regexec_capture(em[i]->param_data, link, strlen(link), ovector, 30, &my_error_msg);
if ((rc == PCRE_ERROR_MATCHLIMIT) || (rc == PCRE_ERROR_RECURSIONLIMIT)) {
msc_string *s = (msc_string *)apr_pcalloc(msr->mp, sizeof(msc_string));
if (s == NULL) return -1;
s->name = apr_pstrdup(msr->mp, "MSC_PCRE_LIMITS_EXCEEDED");
if (s->name == NULL) return -1;
s->name_len = strlen(s->name);
s->value = apr_pstrdup(msr->mp, "1");
if (s->value == NULL) return -1;
s->value_len = 1;
apr_table_setn(msr->tx_vars, s->name, (void *)s);
error_msg = apr_psprintf(msr->mp,
"Execution error - "
"PCRE limits exceeded for Hash regex [%s] (%d): %s",
em[i]->param,rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
#ifdef WAF_JSON_LOGGING_ENABLE
msr_log_with_errorcode(msr, 4, 1, "%s.", error_msg);
#else
msr_log(msr, 4, "%s.", error_msg);
#endif
return 0; /* No match. */
}
else if (rc < -1) {
error_msg = apr_psprintf(msr->mp, "Regex execution failed (%d): %s",
rc, my_error_msg);
if (msr->txcfg->debuglog_level >= 4)
msr_log(msr, 4, "%s.", error_msg);
return -1;
}
if (rc != PCRE_ERROR_NOMATCH) { /* Match. */
return 1;
}
}
break;
}
}
}
return 0;
}