s->init_data->curbuf->id = list;
s->init_data->curbuf->head = NULL;
s->init_data->curbuf->tail = NULL;
+ s->init_data->curbuf->multi_capable =
+ DetectEngineBufferTypeSupportsMultiInstanceGetById(de_ctx, list);
SCLogDebug("new: idx %u list %d set up curbuf %p", s->init_data->buffer_index - 1, list,
s->init_data->curbuf);
if (new_list == -1) {
SCReturnInt(-1);
}
+ int base_list = s->init_data->list;
SCLogDebug("new_list %d", new_list);
s->init_data->list = new_list;
s->init_data->list_set = false;
return -1;
}
s->init_data->curbuf = &s->init_data->buffers[s->init_data->buffer_index++];
+ s->init_data->curbuf->multi_capable =
+ DetectEngineBufferTypeSupportsMultiInstanceGetById(de_ctx, base_list);
}
if (s->init_data->curbuf == NULL) {
SCLogError("failed to setup buffer");
SCLogError("no matches for previous buffer");
return -1;
}
- if (SignatureInitDataBufferCheckExpand(s) < 0) {
- SCLogError("failed to expand rule buffer array");
- return -1;
+ bool reuse_buffer = false;
+ if (s->init_data->curbuf != NULL && (int)s->init_data->curbuf->id != sm_list) {
+ for (uint32_t x = 0; x < s->init_data->buffer_index; x++) {
+ if (s->init_data->buffers[x].id == (uint32_t)sm_list) {
+ s->init_data->curbuf = &s->init_data->buffers[x];
+ reuse_buffer = true;
+ break;
+ }
+ }
}
- /* initialize a new buffer */
- s->init_data->curbuf = &s->init_data->buffers[s->init_data->buffer_index++];
- s->init_data->curbuf->id = sm_list;
- s->init_data->curbuf->head = NULL;
- s->init_data->curbuf->tail = NULL;
- SCLogDebug("idx %u list %d set up curbuf %p s->init_data->buffer_index %u",
- s->init_data->buffer_index - 1, sm_list, s->init_data->curbuf,
- s->init_data->buffer_index);
+ if (!reuse_buffer) {
+ if (SignatureInitDataBufferCheckExpand(s) < 0) {
+ SCLogError("failed to expand rule buffer array");
+ return -1;
+ }
+
+ /* initialize a new buffer */
+ s->init_data->curbuf = &s->init_data->buffers[s->init_data->buffer_index++];
+ s->init_data->curbuf->id = sm_list;
+ s->init_data->curbuf->head = NULL;
+ s->init_data->curbuf->tail = NULL;
+ SCLogDebug("idx %u list %d set up curbuf %p s->init_data->buffer_index %u",
+ s->init_data->buffer_index - 1, sm_list, s->init_data->curbuf,
+ s->init_data->buffer_index);
+ }
}
/* transfer the sm from the pmatch list to sm_list */
SCLogDebug("reset: list %d != s->init_data->list %d", list, s->init_data->list);
s->init_data->list = DETECT_SM_LIST_NOTSET;
}
+
+ if (s->init_data->curbuf != NULL && (int)s->init_data->curbuf->id != list) {
+ for (uint32_t x = 0; x < s->init_data->buffer_index; x++) {
+ if (s->init_data->buffers[x].id == (uint32_t)list &&
+ !s->init_data->buffers[x].multi_capable) {
+ SCLogDebug("reusing buffer %u as it isn't multi-capable", x);
+ s->init_data->curbuf = &s->init_data->buffers[x];
+ break;
+ }
+ }
+ }
+
if ((s->init_data->curbuf != NULL && (int)s->init_data->curbuf->id != list) ||
s->init_data->curbuf == NULL) {
if (SignatureInitDataBufferCheckExpand(s) < 0) {