Skip to content

Commit

Permalink
scratch: remove quick validity check
Browse files Browse the repository at this point in the history
Roll back fix for github issue intel#350

About Scratch Usage:
For compile time, scratch space is strongly recommended to be
allocated immediately after database generation.
For runtime, besides using scratch for corresponding database,
Hyperscan also allows user to use larger scratch space allocated
for another database.
When multiple concurrent threads need to use the same databases
and a new scratch space is required, cloning the largest one is
always safe. This is realized based on API hs_scratch_size() and
hs_clone_scratch().
Behaviors beyond above are discouraged and results are undefined.
  • Loading branch information
hongyang7 authored and markos committed Sep 5, 2023
1 parent ab4f837 commit c652345
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 27 deletions.
37 changes: 21 additions & 16 deletions src/runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ u8 *getHistory(char *state, const struct RoseEngine *t, u64a offset) {
* callers.
*/
static really_inline
char validScratch(const struct hs_scratch *s, u32 crc) {
char validScratch(const struct RoseEngine *t, const struct hs_scratch *s) {
if (!ISALIGNED_CL(s)) {
DEBUG_PRINTF("bad alignment %p\n", s);
return 0;
Expand All @@ -101,12 +101,18 @@ char validScratch(const struct hs_scratch *s, u32 crc) {
return 0;
}

/* add quick rose sanity checks by db crc*/
if (s->db_crc != crc) {
DEBUG_PRINTF("Improper scratch for current db\n");
if (t->mode == HS_MODE_BLOCK && t->stateOffsets.end > s->bStateSize) {
DEBUG_PRINTF("bad state size\n");
return 0;
}

if (t->queueCount > s->queueCount) {
DEBUG_PRINTF("bad queue count\n");
return 0;
}

/* TODO: add quick rose sanity checks */

return 1;
}

Expand Down Expand Up @@ -329,7 +335,7 @@ hs_error_t HS_CDECL hs_scan(const hs_database_t *db, const char *data,
return HS_DB_MODE_ERROR;
}

if (unlikely(!validScratch(scratch, db->crc32))) {
if (unlikely(!validScratch(rose, scratch))) {
return HS_INVALID;
}

Expand Down Expand Up @@ -503,7 +509,7 @@ void maintainHistoryBuffer(const struct RoseEngine *rose, char *state,

static really_inline
void init_stream(struct hs_stream *s, const struct RoseEngine *rose,
char init_history, u32 crc) {
char init_history) {
char *state = getMultiState(s);

if (init_history) {
Expand All @@ -518,7 +524,6 @@ void init_stream(struct hs_stream *s, const struct RoseEngine *rose,

s->rose = rose;
s->offset = 0;
s->crc32 = crc;

setStreamStatus(state, 0);
roseInitState(rose, state);
Expand Down Expand Up @@ -563,7 +568,7 @@ hs_error_t HS_CDECL hs_open_stream(const hs_database_t *db,
return HS_NOMEM;
}

init_stream(s, rose, 1, db->crc32);
init_stream(s, rose, 1);

*stream = s;
return HS_SUCCESS;
Expand Down Expand Up @@ -751,7 +756,7 @@ hs_error_t HS_CDECL hs_reset_and_copy_stream(hs_stream_t *to_id,
}

if (onEvent) {
if (!scratch || !validScratch(scratch, to_id->crc32)) {
if (!scratch || !validScratch(to_id->rose, scratch)) {
return HS_INVALID;
}
if (unlikely(markScratchInUse(scratch))) {
Expand Down Expand Up @@ -977,7 +982,7 @@ hs_error_t HS_CDECL hs_scan_stream(hs_stream_t *id, const char *data,
hs_scratch_t *scratch,
match_event_handler onEvent, void *context) {
if (unlikely(!id || !scratch || !data ||
!validScratch(scratch, id->crc32))) {
!validScratch(id->rose, scratch))) {
return HS_INVALID;
}

Expand All @@ -999,7 +1004,7 @@ hs_error_t HS_CDECL hs_close_stream(hs_stream_t *id, hs_scratch_t *scratch,
}

if (onEvent) {
if (!scratch || !validScratch(scratch, id->crc32)) {
if (!scratch || !validScratch(id->rose, scratch)) {
return HS_INVALID;
}
if (unlikely(markScratchInUse(scratch))) {
Expand Down Expand Up @@ -1029,7 +1034,7 @@ hs_error_t HS_CDECL hs_reset_stream(hs_stream_t *id, UNUSED unsigned int flags,
}

if (onEvent) {
if (!scratch || !validScratch(scratch, id->crc32)) {
if (!scratch || !validScratch(id->rose, scratch)) {
return HS_INVALID;
}
if (unlikely(markScratchInUse(scratch))) {
Expand All @@ -1044,7 +1049,7 @@ hs_error_t HS_CDECL hs_reset_stream(hs_stream_t *id, UNUSED unsigned int flags,
}

// history already initialised
init_stream(id, id->rose, 0, id->crc32);
init_stream(id, id->rose, 0);

return HS_SUCCESS;
}
Expand Down Expand Up @@ -1123,7 +1128,7 @@ hs_error_t HS_CDECL hs_scan_vector(const hs_database_t *db,
return HS_DB_MODE_ERROR;
}

if (unlikely(!validScratch(scratch, db->crc32))) {
if (unlikely(!validScratch(rose, scratch))) {
return HS_INVALID;
}

Expand All @@ -1133,7 +1138,7 @@ hs_error_t HS_CDECL hs_scan_vector(const hs_database_t *db,

hs_stream_t *id = (hs_stream_t *)(scratch->bstate);

init_stream(id, rose, 1, db->crc32); /* open stream */
init_stream(id, rose, 1); /* open stream */

for (u32 i = 0; i < count; i++) {
DEBUG_PRINTF("block %u/%u offset=%llu len=%u\n", i, count, id->offset,
Expand Down Expand Up @@ -1248,7 +1253,7 @@ hs_error_t HS_CDECL hs_reset_and_expand_stream(hs_stream_t *to_stream,
const struct RoseEngine *rose = to_stream->rose;

if (onEvent) {
if (!scratch || !validScratch(scratch, to_stream->crc32)) {
if (!scratch || !validScratch(to_stream->rose, scratch)) {
return HS_INVALID;
}
if (unlikely(markScratchInUse(scratch))) {
Expand Down
4 changes: 1 addition & 3 deletions src/scratch.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015-2022, Intel Corporation
* Copyright (c) 2015-2023, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
Expand Down Expand Up @@ -373,15 +373,13 @@ hs_error_t HS_CDECL hs_alloc_scratch(const hs_database_t *db,
hs_scratch_free((*scratch)->scratch_alloc);
}

proto->db_crc = db->crc32;
hs_error_t alloc_ret = alloc_scratch(proto, scratch);
hs_scratch_free(proto_tmp); /* kill off temp used for sizing */
if (alloc_ret != HS_SUCCESS) {
*scratch = NULL;
return alloc_ret;
}
} else {
(*scratch)->db_crc = db->crc32;
hs_scratch_free(proto_tmp); /* kill off temp used for sizing */
unmarkScratchInUse(*scratch);
}
Expand Down
3 changes: 1 addition & 2 deletions src/scratch.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015-2022, Intel Corporation
* Copyright (c) 2015-2023, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
Expand Down Expand Up @@ -171,7 +171,6 @@ struct match_deduper {
*/
struct ALIGN_CL_DIRECTIVE hs_scratch {
u32 magic;
u32 db_crc; /**< identity of a scratch space, for validity check */
u8 in_use; /**< non-zero when being used by an API call. */
u32 queueCount;
u32 activeQueueArraySize; /**< size of active queue array fatbit in bytes */
Expand Down
5 changes: 1 addition & 4 deletions src/state.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2015-2022, Intel Corporation
* Copyright (c) 2015-2023, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
Expand Down Expand Up @@ -57,9 +57,6 @@ struct hs_stream {

/** \brief The current stream offset. */
u64a offset;

/** \brief Identity of hs_stream, for scratch validity check. */
u32 crc32;
};

#define getMultiState(hs_s) ((char *)(hs_s) + sizeof(*(hs_s)))
Expand Down
3 changes: 1 addition & 2 deletions src/stream_compress_impl.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017-2022, Intel Corporation
* Copyright (c) 2017-2023, Intel Corporation
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
Expand Down Expand Up @@ -116,7 +116,6 @@ size_t JOIN(sc_, FN_SUFFIX)(const struct RoseEngine *rose,
= ((STREAM_QUAL char *)stream) + sizeof(struct hs_stream);

COPY_FIELD(stream->offset);
COPY_FIELD(stream->crc32);
ASSIGN(stream->rose, rose);

COPY(stream_body + ROSE_STATE_OFFSET_STATUS_FLAGS, 1);
Expand Down

0 comments on commit c652345

Please sign in to comment.