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;
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 *)
UtRegisterTest("DetectPcreParseTest25", DetectPcreParseTest25);
UtRegisterTest("DetectPcreParseTest26", DetectPcreParseTest26);
UtRegisterTest("DetectPcreParseTest27", DetectPcreParseTest27);
+ UtRegisterTest("DetectPcreParseTest28", DetectPcreParseTest28);
UtRegisterTest("DetectPcreTestSig01 -- pcre test", DetectPcreTestSig01);
UtRegisterTest("DetectPcreTestSig02 -- pcre test", DetectPcreTestSig02);