detect/content: cleanup nocase conversion

(cherry picked from commit ef936acdba)
pull/9362/head
Victor Julien 3 years ago committed by Victor Julien
parent 69895fbe00
commit 71ec1c85ff

@ -658,6 +658,30 @@ void DetectContentPropagateLimits(Signature *s)
#undef VALIDATE
}
int DetectContentConvertToNocase(DetectEngineCtx *de_ctx, DetectContentData *cd)
{
if (cd->flags & DETECT_CONTENT_NOCASE) {
SCLogError(SC_ERR_INVALID_SIGNATURE,
"can't use multiple nocase modifiers with the same content");
return -1;
}
/* for consistency in later use (e.g. by MPM construction and hashing),
* coerce the content string to lower-case. */
for (uint8_t *c = cd->content; c < cd->content + cd->content_len; c++) {
*c = u8_tolower(*c);
}
cd->flags |= DETECT_CONTENT_NOCASE;
/* Recreate the context with nocase chars */
SpmDestroyCtx(cd->spm_ctx);
cd->spm_ctx = SpmInitCtx(cd->content, cd->content_len, 1, de_ctx->spm_global_thread_ctx);
if (cd->spm_ctx == NULL) {
return -1;
}
return 0;
}
#ifdef UNITTESTS /* UNITTESTS */
static bool TestLastContent(const Signature *s, uint16_t o, uint16_t d)

@ -123,4 +123,6 @@ void DetectContentFree(DetectEngineCtx *, void *);
bool DetectContentPMATCHValidateCallback(const Signature *s);
void DetectContentPropagateLimits(Signature *s);
int DetectContentConvertToNocase(DetectEngineCtx *de_ctx, DetectContentData *cd);
#endif /* __DETECT_CONTENT_H__ */

@ -73,30 +73,8 @@ static int DetectNocaseSetup (DetectEngineCtx *de_ctx, Signature *s, const char
goto end;
}
/* verify other conditions. */
DetectContentData *cd = (DetectContentData *)pm->ctx;;
if (cd->flags & DETECT_CONTENT_NOCASE) {
SCLogError(SC_ERR_INVALID_SIGNATURE, "can't use multiple nocase modifiers with the same content");
goto end;
}
/* for consistency in later use (e.g. by MPM construction and hashing),
* coerce the content string to lower-case. */
for (uint8_t *c = cd->content; c < cd->content + cd->content_len; c++) {
*c = u8_tolower(*c);
}
cd->flags |= DETECT_CONTENT_NOCASE;
/* Recreate the context with nocase chars */
SpmDestroyCtx(cd->spm_ctx);
cd->spm_ctx = SpmInitCtx(cd->content, cd->content_len, 1,
de_ctx->spm_global_thread_ctx);
if (cd->spm_ctx == NULL) {
goto end;
}
ret = 0;
DetectContentData *cd = (DetectContentData *)pm->ctx;
ret = DetectContentConvertToNocase(de_ctx, cd);
end:
SCReturnInt(ret);
}

Loading…
Cancel
Save