pcre: fix \xHH issue for http_host

The http_host keyword checks if the regex contains uppercase characters.
This check was rejecting valid syntax in the following format:

    content:"|2E|suricata"; http_host; pcre:"/\x2Esuricata$/W";

This patch addresses this case.

Bug #1957.
pull/2826/head
Victor Julien 9 years ago
parent c18e950d7d
commit 5781c8fc78

@ -290,14 +290,27 @@ static int DetectPcreSetList(int list, int set)
static int DetectPcreHasUpperCase(const char *re)
{
size_t len = strlen(re);
int is_meta = 0;
bool is_meta = false;
bool is_meta_hex = false;
int meta_hex_cnt = 0;
for (size_t i = 0; i < len; i++) {
if (is_meta) {
is_meta = 0;
if (is_meta_hex) {
meta_hex_cnt++;
if (meta_hex_cnt == 2) {
is_meta_hex = false;
meta_hex_cnt = 0;
}
} else if (is_meta) {
if (re[i] == 'x') {
is_meta_hex = true;
} else {
is_meta = false;
}
}
else if (re[i] == '\\') {
is_meta = 1;
is_meta = true;
}
else if (isupper((unsigned char)re[i])) {
return 1;
@ -1544,6 +1557,23 @@ static int DetectPcreParseTest27(void)
PASS;
}
/** \test Bug 1957 */
static int DetectPcreParseTest28(void)
{
DetectEngineCtx *de_ctx = NULL;
FAIL_IF( (de_ctx = DetectEngineCtxInit()) == NULL);
de_ctx->flags |= DE_QUIET;
de_ctx->sig_list = SigInit(de_ctx, "alert tcp any any -> any 80 "
"(content:\"|2E|suricata\"; http_host; pcre:\"/\\x2Esuricata$/W\"; "
"sid:2; rev:2;)");
FAIL_IF_NULL(de_ctx->sig_list);
DetectEngineCtxFree(de_ctx);
PASS;
}
static int DetectPcreTestSig01(void)
{
uint8_t *buf = (uint8_t *)
@ -3483,6 +3513,7 @@ static void DetectPcreRegisterTests(void)
UtRegisterTest("DetectPcreParseTest25", DetectPcreParseTest25);
UtRegisterTest("DetectPcreParseTest26", DetectPcreParseTest26);
UtRegisterTest("DetectPcreParseTest27", DetectPcreParseTest27);
UtRegisterTest("DetectPcreParseTest28", DetectPcreParseTest28);
UtRegisterTest("DetectPcreTestSig01 -- pcre test", DetectPcreTestSig01);
UtRegisterTest("DetectPcreTestSig02 -- pcre test", DetectPcreTestSig02);

Loading…
Cancel
Save