@@ -433,20 +433,27 @@ class RulesProperties {
433
433
for (int i = 0 ; i < modsecurity::Phases::NUMBER_OF_PHASES; i++) {
434
434
std::vector<modsecurity::Rule *> *rules_to = to+i;
435
435
std::vector<modsecurity::Rule *> *rules_from = from+i;
436
+ // TODO: std::vector could be replaced with something more efficient.
437
+ std::vector<int64_t > v;
438
+ v.reserve (rules_to->size ());
439
+ for (size_t z = 0 ; z < rules_to->size (); z++) {
440
+ Rule *rule_ckc = rules_to->at (z);
441
+ if (rule_ckc->m_secMarker == false ) {
442
+ continue ;
443
+ }
444
+ v.push_back (rule_ckc->m_ruleId );
445
+ }
446
+ std::sort (v.begin (), v.end ());
447
+
436
448
for (size_t j = 0 ; j < rules_from->size (); j++) {
437
449
Rule *rule = rules_from->at (j);
438
- for (size_t z = 0 ; z < rules_to->size (); z++) {
439
- Rule *rule_ckc = rules_to->at (z);
440
- if (rule_ckc->m_ruleId == rule->m_ruleId &&
441
- rule_ckc->m_secMarker == false &&
442
- rule->m_secMarker == false ) {
443
- if (err != NULL ) {
444
- *err << " Rule id: " \
445
- << std::to_string (rule->m_ruleId ) \
446
- << " is duplicated" << std::endl;
447
- }
448
- return -1 ;
450
+ if (std::binary_search (v.begin (), v.end (), rule->m_ruleId )) {
451
+ if (err != NULL ) {
452
+ *err << " Rule id: " \
453
+ << std::to_string (rule->m_ruleId ) \
454
+ << " is duplicated" << std::endl;
449
455
}
456
+ return -1 ;
450
457
}
451
458
amount_of_rules++;
452
459
rules_to->push_back (rule);
0 commit comments