@@ -289,19 +289,32 @@ int DetectEngineContentModifierBufferSetup(DetectEngineCtx *de_ctx,
289
289
SCLogError ("no matches for previous buffer" );
290
290
return -1 ;
291
291
}
292
- if (SignatureInitDataBufferCheckExpand (s ) < 0 ) {
293
- SCLogError ("failed to expand rule buffer array" );
294
- return -1 ;
292
+ bool reuse_buffer = false;
293
+ if (s -> init_data -> curbuf != NULL && (int )s -> init_data -> curbuf -> id != sm_list ) {
294
+ for (uint32_t x = 0 ; x < s -> init_data -> buffer_index ; x ++ ) {
295
+ if (s -> init_data -> buffers [x ].id == (uint32_t )sm_list ) {
296
+ s -> init_data -> curbuf = & s -> init_data -> buffers [x ];
297
+ reuse_buffer = true;
298
+ break ;
299
+ }
300
+ }
295
301
}
296
302
297
- /* initialize a new buffer */
298
- s -> init_data -> curbuf = & s -> init_data -> buffers [s -> init_data -> buffer_index ++ ];
299
- s -> init_data -> curbuf -> id = sm_list ;
300
- s -> init_data -> curbuf -> head = NULL ;
301
- s -> init_data -> curbuf -> tail = NULL ;
302
- SCLogDebug ("idx %u list %d set up curbuf %p s->init_data->buffer_index %u" ,
303
- s -> init_data -> buffer_index - 1 , sm_list , s -> init_data -> curbuf ,
304
- s -> init_data -> buffer_index );
303
+ if (!reuse_buffer ) {
304
+ if (SignatureInitDataBufferCheckExpand (s ) < 0 ) {
305
+ SCLogError ("failed to expand rule buffer array" );
306
+ return -1 ;
307
+ }
308
+
309
+ /* initialize a new buffer */
310
+ s -> init_data -> curbuf = & s -> init_data -> buffers [s -> init_data -> buffer_index ++ ];
311
+ s -> init_data -> curbuf -> id = sm_list ;
312
+ s -> init_data -> curbuf -> head = NULL ;
313
+ s -> init_data -> curbuf -> tail = NULL ;
314
+ SCLogDebug ("idx %u list %d set up curbuf %p s->init_data->buffer_index %u" ,
315
+ s -> init_data -> buffer_index - 1 , sm_list , s -> init_data -> curbuf ,
316
+ s -> init_data -> buffer_index );
317
+ }
305
318
}
306
319
307
320
/* transfer the sm from the pmatch list to sm_list */
@@ -469,6 +482,18 @@ void SigMatchAppendSMToList(Signature *s, SigMatch *new, const int list)
469
482
SCLogDebug ("reset: list %d != s->init_data->list %d" , list , s -> init_data -> list );
470
483
s -> init_data -> list = DETECT_SM_LIST_NOTSET ;
471
484
}
485
+
486
+ if (s -> init_data -> curbuf != NULL && (int )s -> init_data -> curbuf -> id != list ) {
487
+ for (uint32_t x = 0 ; x < s -> init_data -> buffer_index ; x ++ ) {
488
+ if (s -> init_data -> buffers [x ].id == (uint32_t )list &&
489
+ !s -> init_data -> buffers [x ].multi_capable ) {
490
+ SCLogDebug ("reusing buffer %u as it isn't multi-capable" , x );
491
+ s -> init_data -> curbuf = & s -> init_data -> buffers [x ];
492
+ break ;
493
+ }
494
+ }
495
+ }
496
+
472
497
if ((s -> init_data -> curbuf != NULL && (int )s -> init_data -> curbuf -> id != list ) ||
473
498
s -> init_data -> curbuf == NULL ) {
474
499
if (SignatureInitDataBufferCheckExpand (s ) < 0 ) {
0 commit comments