From 5a9ff548f66ec77f5aeb92ef221f813d9adad626 Mon Sep 17 00:00:00 2001 From: Tom Sommer Date: Sat, 19 Sep 2026 16:27:37 +0200 Subject: [PATCH 1/2] Fix memory leak on the SecDefaultAction error paths The SecDefaultAction rule released the parsed actions out of the bison semantic value into a raw std::vector allocated with new, and only deleted that vector on the last line of the action. All four validation failures in between (transformation none, action not suitable for SecDefaultAction, missing disruptive action, phase already configured) leave the block through YYERROR, so the vector and every Action it had taken ownership of were leaked. A configuration error is not a one-off: nginx re-parses the whole rule set in the master process on every reload and on every configuration test, so a single bad SecDefaultAction leaks on each of them. Instead of releasing the actions, iterate over the semantic value by reference and move the suitable ones into a local std::vector>, which is then moved into driver.m_defaultActions. The phase action no longer needs an explicit delete, it is simply left behind and destroyed with the semantic value. YYERROR is a goto, so the destructors of the block scope locals still run, and bison reclaims the rule's right hand side with yypop_() in yyerrorlab, which destroys the variant holding the vector of unique_ptr. Nothing is leaked on either path. The regenerated seclang-parser.cc is included; it was produced with the same bison 3.8.2 that generated the checked-in file, so the diff is limited to the rule body, the yyrline_ table and the #line directives. A regression test covering a SecDefaultAction without a disruptive action was added to test/test-cases/regression/config-secdefaultaction.json. --- src/parser/seclang-parser.cc | 1579 ++++++++--------- src/parser/seclang-parser.yy | 19 +- .../regression/config-secdefaultaction.json | 42 + 3 files changed, 834 insertions(+), 806 deletions(-) diff --git a/src/parser/seclang-parser.cc b/src/parser/seclang-parser.cc index e427e354dd..a68088535e 100644 --- a/src/parser/seclang-parser.cc +++ b/src/parser/seclang-parser.cc @@ -2443,14 +2443,11 @@ namespace yy { #line 1212 "seclang-parser.yy" { bool hasDisruptive = false; - std::vector *actions = new std::vector(); - for (auto &i : *yystack_[0].value.as < std::unique_ptr > > > ().get()) { - actions->push_back(i.release()); - } - std::vector checkedActions; + std::vector> checkedActions; int definedPhase = -1; int secRuleDefinedPhase = -1; - for (actions::Action *a : *actions) { + for (auto &i : *yystack_[0].value.as < std::unique_ptr > > > ().get()) { + actions::Action *a = i.get(); actions::Phase *phase = dynamic_cast(a); if (a->isDisruptive() == true && dynamic_cast(a) == NULL) { hasDisruptive = true; @@ -2458,7 +2455,6 @@ namespace yy { if (phase != NULL) { definedPhase = phase->m_phase; secRuleDefinedPhase = phase->m_secRulesPhase; - delete phase; } else if (a->action_kind == actions::Action::Kind::RunTimeOnlyIfMatchKind || a->action_kind == actions::Action::Kind::RunTimeBeforeMatchAttemptKind) { actions::transformations::None *none = dynamic_cast(a); @@ -2466,7 +2462,7 @@ namespace yy { driver.error(yystack_[2].location, "The transformation none is not suitable to be part of the SecDefaultActions"); YYERROR; } - checkedActions.push_back(a); + checkedActions.push_back(std::move(i)); } else { driver.error(yystack_[2].location, "The action '" + *a->m_name.get() + "' is not suitable to be part of the SecDefaultActions"); YYERROR; @@ -2490,85 +2486,82 @@ namespace yy { YYERROR; } - for (actions::Action *a : checkedActions) { - driver.m_defaultActions[definedPhase].push_back( - std::unique_ptr(a)); + for (auto &a : checkedActions) { + driver.m_defaultActions[definedPhase].push_back(std::move(a)); } - - delete actions; } -#line 2501 "seclang-parser.cc" +#line 2494 "seclang-parser.cc" break; case 81: // expression: "CONFIG_DIR_SEC_MARKER" -#line 1269 "seclang-parser.yy" +#line 1262 "seclang-parser.yy" { driver.addSecMarker(modsecurity::utils::string::removeBracketsIfNeeded(yystack_[0].value.as < std::string > ()), /* file name */ std::string(*yystack_[0].location.end.filename), /* line number */ yystack_[0].location.end.line ); } -#line 2512 "seclang-parser.cc" +#line 2505 "seclang-parser.cc" break; case 82: // expression: "CONFIG_DIR_RULE_ENG" "CONFIG_VALUE_OFF" -#line 1276 "seclang-parser.yy" +#line 1269 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::DisabledRuleEngine; } -#line 2520 "seclang-parser.cc" +#line 2513 "seclang-parser.cc" break; case 83: // expression: "CONFIG_DIR_RULE_ENG" "CONFIG_VALUE_ON" -#line 1280 "seclang-parser.yy" +#line 1273 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::EnabledRuleEngine; } -#line 2528 "seclang-parser.cc" +#line 2521 "seclang-parser.cc" break; case 84: // expression: "CONFIG_DIR_RULE_ENG" "CONFIG_VALUE_DETC" -#line 1284 "seclang-parser.yy" +#line 1277 "seclang-parser.yy" { driver.m_secRuleEngine = modsecurity::RulesSet::DetectionOnlyRuleEngine; } -#line 2536 "seclang-parser.cc" +#line 2529 "seclang-parser.cc" break; case 85: // expression: "CONFIG_DIR_REQ_BODY" "CONFIG_VALUE_ON" -#line 1288 "seclang-parser.yy" +#line 1281 "seclang-parser.yy" { driver.m_secRequestBodyAccess = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 2544 "seclang-parser.cc" +#line 2537 "seclang-parser.cc" break; case 86: // expression: "CONFIG_DIR_REQ_BODY" "CONFIG_VALUE_OFF" -#line 1292 "seclang-parser.yy" +#line 1285 "seclang-parser.yy" { driver.m_secRequestBodyAccess = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 2552 "seclang-parser.cc" +#line 2545 "seclang-parser.cc" break; case 87: // expression: "CONFIG_DIR_RES_BODY" "CONFIG_VALUE_ON" -#line 1296 "seclang-parser.yy" +#line 1289 "seclang-parser.yy" { driver.m_secResponseBodyAccess = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 2560 "seclang-parser.cc" +#line 2553 "seclang-parser.cc" break; case 88: // expression: "CONFIG_DIR_RES_BODY" "CONFIG_VALUE_OFF" -#line 1300 "seclang-parser.yy" +#line 1293 "seclang-parser.yy" { driver.m_secResponseBodyAccess = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 2568 "seclang-parser.cc" +#line 2561 "seclang-parser.cc" break; case 89: // expression: "CONFIG_SEC_ARGUMENT_SEPARATOR" -#line 1304 "seclang-parser.yy" +#line 1297 "seclang-parser.yy" { if (yystack_[0].value.as < std::string > ().length() != 1) { driver.error(yystack_[1].location, "Argument separator should be set to a single character."); @@ -2577,259 +2570,259 @@ namespace yy { driver.m_secArgumentSeparator.m_value = yystack_[0].value.as < std::string > (); driver.m_secArgumentSeparator.m_set = true; } -#line 2581 "seclang-parser.cc" +#line 2574 "seclang-parser.cc" break; case 90: // expression: "CONFIG_COMPONENT_SIG" -#line 1313 "seclang-parser.yy" +#line 1306 "seclang-parser.yy" { driver.m_components.push_back(yystack_[0].value.as < std::string > ()); } -#line 2589 "seclang-parser.cc" +#line 2582 "seclang-parser.cc" break; case 91: // expression: "CONFIG_CONN_ENGINE" "CONFIG_VALUE_ON" -#line 1317 "seclang-parser.yy" +#line 1310 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecConnEngine is not yet supported."); YYERROR; } -#line 2598 "seclang-parser.cc" +#line 2591 "seclang-parser.cc" break; case 92: // expression: "CONFIG_CONN_ENGINE" "CONFIG_VALUE_OFF" -#line 1322 "seclang-parser.yy" +#line 1315 "seclang-parser.yy" { } -#line 2605 "seclang-parser.cc" +#line 2598 "seclang-parser.cc" break; case 93: // expression: "CONFIG_SEC_WEB_APP_ID" -#line 1325 "seclang-parser.yy" +#line 1318 "seclang-parser.yy" { driver.m_secWebAppId.m_value = yystack_[0].value.as < std::string > (); driver.m_secWebAppId.m_set = true; } -#line 2614 "seclang-parser.cc" +#line 2607 "seclang-parser.cc" break; case 94: // expression: "CONFIG_SEC_SERVER_SIG" -#line 1330 "seclang-parser.yy" +#line 1323 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecServerSignature is not supported."); YYERROR; } -#line 2623 "seclang-parser.cc" +#line 2616 "seclang-parser.cc" break; case 95: // expression: "CONFIG_SEC_CACHE_TRANSFORMATIONS" -#line 1335 "seclang-parser.yy" +#line 1328 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecCacheTransformations is not supported."); YYERROR; } -#line 2632 "seclang-parser.cc" +#line 2625 "seclang-parser.cc" break; case 96: // expression: "CONFIG_SEC_DISABLE_BACKEND_COMPRESS" "CONFIG_VALUE_ON" -#line 1340 "seclang-parser.yy" +#line 1333 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecDisableBackendCompression is not supported."); YYERROR; } -#line 2641 "seclang-parser.cc" +#line 2634 "seclang-parser.cc" break; case 97: // expression: "CONFIG_SEC_DISABLE_BACKEND_COMPRESS" "CONFIG_VALUE_OFF" -#line 1345 "seclang-parser.yy" +#line 1338 "seclang-parser.yy" { } -#line 2648 "seclang-parser.cc" +#line 2641 "seclang-parser.cc" break; case 98: // expression: "CONFIG_CONTENT_INJECTION" "CONFIG_VALUE_ON" -#line 1348 "seclang-parser.yy" +#line 1341 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecContentInjection is not yet supported."); YYERROR; } -#line 2657 "seclang-parser.cc" +#line 2650 "seclang-parser.cc" break; case 99: // expression: "CONFIG_CONTENT_INJECTION" "CONFIG_VALUE_OFF" -#line 1353 "seclang-parser.yy" +#line 1346 "seclang-parser.yy" { } -#line 2664 "seclang-parser.cc" +#line 2657 "seclang-parser.cc" break; case 100: // expression: "CONFIG_SEC_CHROOT_DIR" -#line 1356 "seclang-parser.yy" +#line 1349 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecChrootDir is not supported."); YYERROR; } -#line 2673 "seclang-parser.cc" +#line 2666 "seclang-parser.cc" break; case 101: // expression: "CONFIG_SEC_HASH_ENGINE" "CONFIG_VALUE_ON" -#line 1361 "seclang-parser.yy" +#line 1354 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecHashEngine is not yet supported."); YYERROR; } -#line 2682 "seclang-parser.cc" +#line 2675 "seclang-parser.cc" break; case 102: // expression: "CONFIG_SEC_HASH_ENGINE" "CONFIG_VALUE_OFF" -#line 1366 "seclang-parser.yy" +#line 1359 "seclang-parser.yy" { } -#line 2689 "seclang-parser.cc" +#line 2682 "seclang-parser.cc" break; case 103: // expression: "CONFIG_SEC_HASH_KEY" -#line 1369 "seclang-parser.yy" +#line 1362 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashKey is not yet supported."); YYERROR; } -#line 2698 "seclang-parser.cc" +#line 2691 "seclang-parser.cc" break; case 104: // expression: "CONFIG_SEC_HASH_PARAM" -#line 1374 "seclang-parser.yy" +#line 1367 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashParam is not yet supported."); YYERROR; } -#line 2707 "seclang-parser.cc" +#line 2700 "seclang-parser.cc" break; case 105: // expression: "CONFIG_SEC_HASH_METHOD_RX" -#line 1379 "seclang-parser.yy" +#line 1372 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashMethodRx is not yet supported."); YYERROR; } -#line 2716 "seclang-parser.cc" +#line 2709 "seclang-parser.cc" break; case 106: // expression: "CONFIG_SEC_HASH_METHOD_PM" -#line 1384 "seclang-parser.yy" +#line 1377 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecHashMethodPm is not yet supported."); YYERROR; } -#line 2725 "seclang-parser.cc" +#line 2718 "seclang-parser.cc" break; case 107: // expression: "CONFIG_DIR_GSB_DB" -#line 1389 "seclang-parser.yy" +#line 1382 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecGsbLookupDb is not supported."); YYERROR; } -#line 2734 "seclang-parser.cc" +#line 2727 "seclang-parser.cc" break; case 108: // expression: "CONFIG_SEC_GUARDIAN_LOG" -#line 1394 "seclang-parser.yy" +#line 1387 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecGuardianLog is not supported."); YYERROR; } -#line 2743 "seclang-parser.cc" +#line 2736 "seclang-parser.cc" break; case 109: // expression: "CONFIG_SEC_INTERCEPT_ON_ERROR" "CONFIG_VALUE_ON" -#line 1399 "seclang-parser.yy" +#line 1392 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecInterceptOnError is not yet supported."); YYERROR; } -#line 2752 "seclang-parser.cc" +#line 2745 "seclang-parser.cc" break; case 110: // expression: "CONFIG_SEC_INTERCEPT_ON_ERROR" "CONFIG_VALUE_OFF" -#line 1404 "seclang-parser.yy" +#line 1397 "seclang-parser.yy" { } -#line 2759 "seclang-parser.cc" +#line 2752 "seclang-parser.cc" break; case 111: // expression: "CONFIG_SEC_CONN_R_STATE_LIMIT" -#line 1407 "seclang-parser.yy" +#line 1400 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecConnReadStateLimit is not yet supported."); YYERROR; } -#line 2768 "seclang-parser.cc" +#line 2761 "seclang-parser.cc" break; case 112: // expression: "CONFIG_SEC_CONN_W_STATE_LIMIT" -#line 1412 "seclang-parser.yy" +#line 1405 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecConnWriteStateLimit is not yet supported."); YYERROR; } -#line 2777 "seclang-parser.cc" +#line 2770 "seclang-parser.cc" break; case 113: // expression: "CONFIG_SEC_SENSOR_ID" -#line 1417 "seclang-parser.yy" +#line 1410 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecSensorId is not yet supported."); YYERROR; } -#line 2786 "seclang-parser.cc" +#line 2779 "seclang-parser.cc" break; case 114: // expression: "CONFIG_SEC_RULE_INHERITANCE" "CONFIG_VALUE_ON" -#line 1422 "seclang-parser.yy" +#line 1415 "seclang-parser.yy" { driver.error(yystack_[2].location, "SecRuleInheritance is not yet supported."); YYERROR; } -#line 2795 "seclang-parser.cc" +#line 2788 "seclang-parser.cc" break; case 115: // expression: "CONFIG_SEC_RULE_INHERITANCE" "CONFIG_VALUE_OFF" -#line 1427 "seclang-parser.yy" +#line 1420 "seclang-parser.yy" { } -#line 2802 "seclang-parser.cc" +#line 2795 "seclang-parser.cc" break; case 116: // expression: "CONFIG_SEC_RULE_PERF_TIME" -#line 1430 "seclang-parser.yy" +#line 1423 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecRulePerfTime is not yet supported."); YYERROR; } -#line 2811 "seclang-parser.cc" +#line 2804 "seclang-parser.cc" break; case 117: // expression: "CONFIG_SEC_STREAM_IN_BODY_INSPECTION" -#line 1435 "seclang-parser.yy" +#line 1428 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecStreamInBodyInspection is not supported."); YYERROR; } -#line 2820 "seclang-parser.cc" +#line 2813 "seclang-parser.cc" break; case 118: // expression: "CONFIG_SEC_STREAM_OUT_BODY_INSPECTION" -#line 1440 "seclang-parser.yy" +#line 1433 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecStreamOutBodyInspection is not supported."); YYERROR; } -#line 2829 "seclang-parser.cc" +#line 2822 "seclang-parser.cc" break; case 119: // expression: "CONFIG_SEC_RULE_REMOVE_BY_ID" -#line 1445 "seclang-parser.yy" +#line 1438 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.load(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2842,11 +2835,11 @@ namespace yy { YYERROR; } } -#line 2846 "seclang-parser.cc" +#line 2839 "seclang-parser.cc" break; case 120: // expression: "CONFIG_SEC_RULE_REMOVE_BY_TAG" -#line 1458 "seclang-parser.yy" +#line 1451 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadRemoveRuleByTag(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2859,11 +2852,11 @@ namespace yy { YYERROR; } } -#line 2863 "seclang-parser.cc" +#line 2856 "seclang-parser.cc" break; case 121: // expression: "CONFIG_SEC_RULE_REMOVE_BY_MSG" -#line 1471 "seclang-parser.yy" +#line 1464 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadRemoveRuleByMsg(yystack_[0].value.as < std::string > (), &error) == false) { @@ -2876,11 +2869,11 @@ namespace yy { YYERROR; } } -#line 2880 "seclang-parser.cc" +#line 2873 "seclang-parser.cc" break; case 122: // expression: "CONFIG_SEC_RULE_UPDATE_TARGET_BY_TAG" variables_pre_process -#line 1484 "seclang-parser.yy" +#line 1477 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadUpdateTargetByTag(yystack_[1].value.as < std::string > (), std::move(yystack_[0].value.as < std::unique_ptr > > > ()), &error) == false) { @@ -2893,11 +2886,11 @@ namespace yy { YYERROR; } } -#line 2897 "seclang-parser.cc" +#line 2890 "seclang-parser.cc" break; case 123: // expression: "CONFIG_SEC_RULE_UPDATE_TARGET_BY_MSG" variables_pre_process -#line 1497 "seclang-parser.yy" +#line 1490 "seclang-parser.yy" { std::string error; if (driver.m_exceptions.loadUpdateTargetByMsg(yystack_[1].value.as < std::string > (), std::move(yystack_[0].value.as < std::unique_ptr > > > ()), &error) == false) { @@ -2910,11 +2903,11 @@ namespace yy { YYERROR; } } -#line 2914 "seclang-parser.cc" +#line 2907 "seclang-parser.cc" break; case 124: // expression: "CONFIG_SEC_RULE_UPDATE_TARGET_BY_ID" variables_pre_process -#line 1510 "seclang-parser.yy" +#line 1503 "seclang-parser.yy" { std::string error; double ruleId; @@ -2940,11 +2933,11 @@ namespace yy { YYERROR; } } -#line 2944 "seclang-parser.cc" +#line 2937 "seclang-parser.cc" break; case 125: // expression: "CONFIG_SEC_RULE_UPDATE_ACTION_BY_ID" actions -#line 1536 "seclang-parser.yy" +#line 1529 "seclang-parser.yy" { std::string error; double ruleId; @@ -2971,11 +2964,11 @@ namespace yy { YYERROR; } } -#line 2975 "seclang-parser.cc" +#line 2968 "seclang-parser.cc" break; case 126: // expression: "CONFIG_DIR_DEBUG_LVL" -#line 1564 "seclang-parser.yy" +#line 1557 "seclang-parser.yy" { if (driver.m_debugLog != NULL) { driver.m_debugLog->setDebugLogLevel(atoi(yystack_[0].value.as < std::string > ().c_str())); @@ -2987,11 +2980,11 @@ namespace yy { YYERROR; } } -#line 2991 "seclang-parser.cc" +#line 2984 "seclang-parser.cc" break; case 127: // expression: "CONFIG_DIR_DEBUG_LOG" -#line 1576 "seclang-parser.yy" +#line 1569 "seclang-parser.yy" { if (driver.m_debugLog != NULL) { std::string error; @@ -3010,11 +3003,11 @@ namespace yy { YYERROR; } } -#line 3014 "seclang-parser.cc" +#line 3007 "seclang-parser.cc" break; case 128: // expression: "CONFIG_DIR_GEO_DB" -#line 1596 "seclang-parser.yy" +#line 1589 "seclang-parser.yy" { #if defined(WITH_GEOIP) or defined(WITH_MAXMIND) std::string err; @@ -3041,29 +3034,29 @@ namespace yy { YYERROR; #endif // WITH_GEOIP } -#line 3045 "seclang-parser.cc" +#line 3038 "seclang-parser.cc" break; case 129: // expression: "CONFIG_DIR_ARGS_LIMIT" -#line 1623 "seclang-parser.yy" +#line 1616 "seclang-parser.yy" { driver.m_argumentsLimit.m_set = true; driver.m_argumentsLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3054 "seclang-parser.cc" +#line 3047 "seclang-parser.cc" break; case 130: // expression: "CONFIG_DIR_REQ_BODY_JSON_DEPTH_LIMIT" -#line 1628 "seclang-parser.yy" +#line 1621 "seclang-parser.yy" { driver.m_requestBodyJsonDepthLimit.m_set = true; driver.m_requestBodyJsonDepthLimit.m_value = atoi(yystack_[0].value.as < std::string > ().c_str()); } -#line 3063 "seclang-parser.cc" +#line 3056 "seclang-parser.cc" break; case 131: // expression: "CONFIG_DIR_REQ_BODY_LIMIT" -#line 1634 "seclang-parser.yy" +#line 1627 "seclang-parser.yy" { std::string errmsg = ""; if (driver.m_requestBodyLimit.parse(std::string(yystack_[0].value.as < std::string > ()), &errmsg) != true) { @@ -3071,11 +3064,11 @@ namespace yy { YYERROR; } } -#line 3075 "seclang-parser.cc" +#line 3068 "seclang-parser.cc" break; case 132: // expression: "CONFIG_DIR_REQ_BODY_NO_FILES_LIMIT" -#line 1642 "seclang-parser.yy" +#line 1635 "seclang-parser.yy" { std::string errmsg = ""; if (driver.m_requestBodyNoFilesLimit.parse(std::string(yystack_[0].value.as < std::string > ()), &errmsg) != true) { @@ -3083,11 +3076,11 @@ namespace yy { YYERROR; } } -#line 3087 "seclang-parser.cc" +#line 3080 "seclang-parser.cc" break; case 133: // expression: "CONFIG_DIR_REQ_BODY_IN_MEMORY_LIMIT" -#line 1650 "seclang-parser.yy" +#line 1643 "seclang-parser.yy" { std::stringstream ss; ss << "As of ModSecurity version 3.0, SecRequestBodyInMemoryLimit is no longer "; @@ -3096,11 +3089,11 @@ namespace yy { driver.error(yystack_[1].location, ss.str()); YYERROR; } -#line 3100 "seclang-parser.cc" +#line 3093 "seclang-parser.cc" break; case 134: // expression: "CONFIG_DIR_RES_BODY_LIMIT" -#line 1659 "seclang-parser.yy" +#line 1652 "seclang-parser.yy" { std::string errmsg = ""; if (driver.m_responseBodyLimit.parse(std::string(yystack_[0].value.as < std::string > ()), &errmsg) != true) { @@ -3108,59 +3101,59 @@ namespace yy { YYERROR; } } -#line 3112 "seclang-parser.cc" +#line 3105 "seclang-parser.cc" break; case 135: // expression: "CONFIG_DIR_REQ_BODY_LIMIT_ACTION" "CONFIG_VALUE_PROCESS_PARTIAL" -#line 1667 "seclang-parser.yy" +#line 1660 "seclang-parser.yy" { driver.m_requestBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::ProcessPartialBodyLimitAction; } -#line 3120 "seclang-parser.cc" +#line 3113 "seclang-parser.cc" break; case 136: // expression: "CONFIG_DIR_REQ_BODY_LIMIT_ACTION" "CONFIG_VALUE_REJECT" -#line 1671 "seclang-parser.yy" +#line 1664 "seclang-parser.yy" { driver.m_requestBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::RejectBodyLimitAction; } -#line 3128 "seclang-parser.cc" +#line 3121 "seclang-parser.cc" break; case 137: // expression: "CONFIG_DIR_RES_BODY_LIMIT_ACTION" "CONFIG_VALUE_PROCESS_PARTIAL" -#line 1675 "seclang-parser.yy" +#line 1668 "seclang-parser.yy" { driver.m_responseBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::ProcessPartialBodyLimitAction; } -#line 3136 "seclang-parser.cc" +#line 3129 "seclang-parser.cc" break; case 138: // expression: "CONFIG_DIR_RES_BODY_LIMIT_ACTION" "CONFIG_VALUE_REJECT" -#line 1679 "seclang-parser.yy" +#line 1672 "seclang-parser.yy" { driver.m_responseBodyLimitAction = modsecurity::RulesSet::BodyLimitAction::RejectBodyLimitAction; } -#line 3144 "seclang-parser.cc" +#line 3137 "seclang-parser.cc" break; case 139: // expression: "CONFIG_SEC_REMOTE_RULES_FAIL_ACTION" "CONFIG_VALUE_ABORT" -#line 1683 "seclang-parser.yy" +#line 1676 "seclang-parser.yy" { driver.m_remoteRulesActionOnFailed = RulesSet::OnFailedRemoteRulesAction::AbortOnFailedRemoteRulesAction; } -#line 3152 "seclang-parser.cc" +#line 3145 "seclang-parser.cc" break; case 140: // expression: "CONFIG_SEC_REMOTE_RULES_FAIL_ACTION" "CONFIG_VALUE_WARN" -#line 1687 "seclang-parser.yy" +#line 1680 "seclang-parser.yy" { driver.m_remoteRulesActionOnFailed = RulesSet::OnFailedRemoteRulesAction::WarnOnFailedRemoteRulesAction; } -#line 3160 "seclang-parser.cc" +#line 3153 "seclang-parser.cc" break; case 142: // expression: "CONFIG_DIR_PCRE_MATCH_LIMIT" -#line 1696 "seclang-parser.yy" +#line 1689 "seclang-parser.yy" { std::string errmsg = ""; if (driver.m_pcreMatchLimit.parse(std::string(yystack_[0].value.as < std::string > ()), &errmsg) != true) { @@ -3168,11 +3161,11 @@ namespace yy { YYERROR; } } -#line 3172 "seclang-parser.cc" +#line 3165 "seclang-parser.cc" break; case 143: // expression: "CONGIG_DIR_RESPONSE_BODY_MP" -#line 1704 "seclang-parser.yy" +#line 1697 "seclang-parser.yy" { std::istringstream buf(yystack_[0].value.as < std::string > ()); std::istream_iterator beg(buf), end; @@ -3184,61 +3177,61 @@ namespace yy { driver.m_responseBodyTypeToBeInspected.m_value.insert(*it); } } -#line 3188 "seclang-parser.cc" +#line 3181 "seclang-parser.cc" break; case 144: // expression: "CONGIG_DIR_RESPONSE_BODY_MP_CLEAR" -#line 1716 "seclang-parser.yy" +#line 1709 "seclang-parser.yy" { driver.m_responseBodyTypeToBeInspected.m_set = true; driver.m_responseBodyTypeToBeInspected.m_clear = true; driver.m_responseBodyTypeToBeInspected.m_value.clear(); } -#line 3198 "seclang-parser.cc" +#line 3191 "seclang-parser.cc" break; case 145: // expression: "CONFIG_XML_EXTERNAL_ENTITY" "CONFIG_VALUE_OFF" -#line 1722 "seclang-parser.yy" +#line 1715 "seclang-parser.yy" { driver.m_secXMLExternalEntity = modsecurity::RulesSetProperties::FalseConfigBoolean; } -#line 3206 "seclang-parser.cc" +#line 3199 "seclang-parser.cc" break; case 146: // expression: "CONFIG_XML_EXTERNAL_ENTITY" "CONFIG_VALUE_ON" -#line 1726 "seclang-parser.yy" +#line 1719 "seclang-parser.yy" { driver.m_secXMLExternalEntity = modsecurity::RulesSetProperties::TrueConfigBoolean; } -#line 3214 "seclang-parser.cc" +#line 3207 "seclang-parser.cc" break; case 147: // expression: "CONFIG_XML_PARSE_XML_INTO_ARGS" "CONFIG_VALUE_ONLYARGS" -#line 1730 "seclang-parser.yy" +#line 1723 "seclang-parser.yy" { driver.m_secXMLParseXmlIntoArgs = modsecurity::RulesSetProperties::OnlyArgsConfigXMLParseXmlIntoArgs; } -#line 3222 "seclang-parser.cc" +#line 3215 "seclang-parser.cc" break; case 148: // expression: "CONFIG_XML_PARSE_XML_INTO_ARGS" "CONFIG_VALUE_OFF" -#line 1734 "seclang-parser.yy" +#line 1727 "seclang-parser.yy" { driver.m_secXMLParseXmlIntoArgs = modsecurity::RulesSetProperties::FalseConfigXMLParseXmlIntoArgs; } -#line 3230 "seclang-parser.cc" +#line 3223 "seclang-parser.cc" break; case 149: // expression: "CONFIG_XML_PARSE_XML_INTO_ARGS" "CONFIG_VALUE_ON" -#line 1738 "seclang-parser.yy" +#line 1731 "seclang-parser.yy" { driver.m_secXMLParseXmlIntoArgs = modsecurity::RulesSetProperties::TrueConfigXMLParseXmlIntoArgs; } -#line 3238 "seclang-parser.cc" +#line 3231 "seclang-parser.cc" break; case 150: // expression: "CONGIG_DIR_SEC_TMP_DIR" -#line 1742 "seclang-parser.yy" +#line 1735 "seclang-parser.yy" { /* Parser error disabled to avoid breaking default installations with modsecurity.conf-recommended std::stringstream ss; @@ -3249,31 +3242,31 @@ namespace yy { YYERROR; */ } -#line 3253 "seclang-parser.cc" +#line 3246 "seclang-parser.cc" break; case 153: // expression: "CONGIG_DIR_SEC_COOKIE_FORMAT" -#line 1763 "seclang-parser.yy" +#line 1756 "seclang-parser.yy" { if (atoi(yystack_[0].value.as < std::string > ().c_str()) == 1) { driver.error(yystack_[1].location, "SecCookieFormat 1 is not yet supported."); YYERROR; } } -#line 3264 "seclang-parser.cc" +#line 3257 "seclang-parser.cc" break; case 154: // expression: "CONFIG_SEC_COOKIEV0_SEPARATOR" -#line 1770 "seclang-parser.yy" +#line 1763 "seclang-parser.yy" { driver.error(yystack_[1].location, "SecCookieV0Separator is not yet supported."); YYERROR; } -#line 3273 "seclang-parser.cc" +#line 3266 "seclang-parser.cc" break; case 156: // expression: "CONFIG_DIR_UNICODE_MAP_FILE" -#line 1780 "seclang-parser.yy" +#line 1773 "seclang-parser.yy" { std::string error; std::vector param; @@ -3327,31 +3320,31 @@ namespace yy { } } -#line 3331 "seclang-parser.cc" +#line 3324 "seclang-parser.cc" break; case 157: // expression: "CONFIG_SEC_COLLECTION_TIMEOUT" -#line 1834 "seclang-parser.yy" +#line 1827 "seclang-parser.yy" { /* Parser error disabled to avoid breaking default CRS installations with crs-setup.conf-recommended driver.error(@0, "SecCollectionTimeout is not yet supported."); YYERROR; */ } -#line 3342 "seclang-parser.cc" +#line 3335 "seclang-parser.cc" break; case 158: // expression: "CONFIG_SEC_HTTP_BLKEY" -#line 1841 "seclang-parser.yy" +#line 1834 "seclang-parser.yy" { driver.m_httpblKey.m_set = true; driver.m_httpblKey.m_value = yystack_[0].value.as < std::string > (); } -#line 3351 "seclang-parser.cc" +#line 3344 "seclang-parser.cc" break; case 159: // variables: variables_pre_process -#line 1849 "seclang-parser.yy" +#line 1842 "seclang-parser.yy" { std::unique_ptr > > originalList = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); std::unique_ptr>> newList(new std::vector>()); @@ -3385,2425 +3378,2425 @@ namespace yy { } yylhs.value.as < std::unique_ptr > > > () = std::move(newNewList); } -#line 3389 "seclang-parser.cc" +#line 3382 "seclang-parser.cc" break; case 160: // variables_pre_process: variables_may_be_quoted -#line 1886 "seclang-parser.yy" +#line 1879 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[0].value.as < std::unique_ptr > > > ()); } -#line 3397 "seclang-parser.cc" +#line 3390 "seclang-parser.cc" break; case 161: // variables_pre_process: "QUOTATION_MARK" variables_may_be_quoted "QUOTATION_MARK" -#line 1890 "seclang-parser.yy" +#line 1883 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[1].value.as < std::unique_ptr > > > ()); } -#line 3405 "seclang-parser.cc" +#line 3398 "seclang-parser.cc" break; case 162: // variables_may_be_quoted: variables_may_be_quoted PIPE var -#line 1897 "seclang-parser.yy" +#line 1890 "seclang-parser.yy" { yystack_[2].value.as < std::unique_ptr > > > ()->push_back(std::move(yystack_[0].value.as < std::unique_ptr > ())); yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[2].value.as < std::unique_ptr > > > ()); } -#line 3414 "seclang-parser.cc" +#line 3407 "seclang-parser.cc" break; case 163: // variables_may_be_quoted: variables_may_be_quoted PIPE VAR_EXCLUSION var -#line 1902 "seclang-parser.yy" +#line 1895 "seclang-parser.yy" { std::unique_ptr c(new VariableModificatorExclusion(std::move(yystack_[0].value.as < std::unique_ptr > ()))); yystack_[3].value.as < std::unique_ptr > > > ()->push_back(std::move(c)); yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[3].value.as < std::unique_ptr > > > ()); } -#line 3424 "seclang-parser.cc" +#line 3417 "seclang-parser.cc" break; case 164: // variables_may_be_quoted: variables_may_be_quoted PIPE VAR_COUNT var -#line 1908 "seclang-parser.yy" +#line 1901 "seclang-parser.yy" { std::unique_ptr c(new VariableModificatorCount(std::move(yystack_[0].value.as < std::unique_ptr > ()))); yystack_[3].value.as < std::unique_ptr > > > ()->push_back(std::move(c)); yylhs.value.as < std::unique_ptr > > > () = std::move(yystack_[3].value.as < std::unique_ptr > > > ()); } -#line 3434 "seclang-parser.cc" +#line 3427 "seclang-parser.cc" break; case 165: // variables_may_be_quoted: var -#line 1914 "seclang-parser.yy" +#line 1907 "seclang-parser.yy" { std::unique_ptr>> b(new std::vector>()); b->push_back(std::move(yystack_[0].value.as < std::unique_ptr > ())); yylhs.value.as < std::unique_ptr > > > () = std::move(b); } -#line 3444 "seclang-parser.cc" +#line 3437 "seclang-parser.cc" break; case 166: // variables_may_be_quoted: VAR_EXCLUSION var -#line 1920 "seclang-parser.yy" +#line 1913 "seclang-parser.yy" { std::unique_ptr>> b(new std::vector>()); std::unique_ptr c(new VariableModificatorExclusion(std::move(yystack_[0].value.as < std::unique_ptr > ()))); b->push_back(std::move(c)); yylhs.value.as < std::unique_ptr > > > () = std::move(b); } -#line 3455 "seclang-parser.cc" +#line 3448 "seclang-parser.cc" break; case 167: // variables_may_be_quoted: VAR_COUNT var -#line 1927 "seclang-parser.yy" +#line 1920 "seclang-parser.yy" { std::unique_ptr>> b(new std::vector>()); std::unique_ptr c(new VariableModificatorCount(std::move(yystack_[0].value.as < std::unique_ptr > ()))); b->push_back(std::move(c)); yylhs.value.as < std::unique_ptr > > > () = std::move(b); } -#line 3466 "seclang-parser.cc" +#line 3459 "seclang-parser.cc" break; case 168: // var: VARIABLE_ARGS "Dictionary element" -#line 1937 "seclang-parser.yy" +#line 1930 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3474 "seclang-parser.cc" +#line 3467 "seclang-parser.cc" break; case 169: // var: VARIABLE_ARGS "Dictionary element, selected by regexp" -#line 1941 "seclang-parser.yy" +#line 1934 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3482 "seclang-parser.cc" +#line 3475 "seclang-parser.cc" break; case 170: // var: VARIABLE_ARGS -#line 1945 "seclang-parser.yy" +#line 1938 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Args_NoDictElement()); } -#line 3490 "seclang-parser.cc" +#line 3483 "seclang-parser.cc" break; case 171: // var: VARIABLE_ARGS_POST "Dictionary element" -#line 1949 "seclang-parser.yy" +#line 1942 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3498 "seclang-parser.cc" +#line 3491 "seclang-parser.cc" break; case 172: // var: VARIABLE_ARGS_POST "Dictionary element, selected by regexp" -#line 1953 "seclang-parser.yy" +#line 1946 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3506 "seclang-parser.cc" +#line 3499 "seclang-parser.cc" break; case 173: // var: VARIABLE_ARGS_POST -#line 1957 "seclang-parser.yy" +#line 1950 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPost_NoDictElement()); } -#line 3514 "seclang-parser.cc" +#line 3507 "seclang-parser.cc" break; case 174: // var: VARIABLE_ARGS_GET "Dictionary element" -#line 1961 "seclang-parser.yy" +#line 1954 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3522 "seclang-parser.cc" +#line 3515 "seclang-parser.cc" break; case 175: // var: VARIABLE_ARGS_GET "Dictionary element, selected by regexp" -#line 1965 "seclang-parser.yy" +#line 1958 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3530 "seclang-parser.cc" +#line 3523 "seclang-parser.cc" break; case 176: // var: VARIABLE_ARGS_GET -#line 1969 "seclang-parser.yy" +#line 1962 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGet_NoDictElement()); } -#line 3538 "seclang-parser.cc" +#line 3531 "seclang-parser.cc" break; case 177: // var: VARIABLE_FILES_SIZES "Dictionary element" -#line 1973 "seclang-parser.yy" +#line 1966 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3546 "seclang-parser.cc" +#line 3539 "seclang-parser.cc" break; case 178: // var: VARIABLE_FILES_SIZES "Dictionary element, selected by regexp" -#line 1977 "seclang-parser.yy" +#line 1970 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3554 "seclang-parser.cc" +#line 3547 "seclang-parser.cc" break; case 179: // var: VARIABLE_FILES_SIZES -#line 1981 "seclang-parser.yy" +#line 1974 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesSizes_NoDictElement()); } -#line 3562 "seclang-parser.cc" +#line 3555 "seclang-parser.cc" break; case 180: // var: VARIABLE_FILES_NAMES "Dictionary element" -#line 1985 "seclang-parser.yy" +#line 1978 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3570 "seclang-parser.cc" +#line 3563 "seclang-parser.cc" break; case 181: // var: VARIABLE_FILES_NAMES "Dictionary element, selected by regexp" -#line 1989 "seclang-parser.yy" +#line 1982 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3578 "seclang-parser.cc" +#line 3571 "seclang-parser.cc" break; case 182: // var: VARIABLE_FILES_NAMES -#line 1993 "seclang-parser.yy" +#line 1986 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesNames_NoDictElement()); } -#line 3586 "seclang-parser.cc" +#line 3579 "seclang-parser.cc" break; case 183: // var: VARIABLE_FILES_TMP_CONTENT "Dictionary element" -#line 1997 "seclang-parser.yy" +#line 1990 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3594 "seclang-parser.cc" +#line 3587 "seclang-parser.cc" break; case 184: // var: VARIABLE_FILES_TMP_CONTENT "Dictionary element, selected by regexp" -#line 2001 "seclang-parser.yy" +#line 1994 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3602 "seclang-parser.cc" +#line 3595 "seclang-parser.cc" break; case 185: // var: VARIABLE_FILES_TMP_CONTENT -#line 2005 "seclang-parser.yy" +#line 1998 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpContent_NoDictElement()); } -#line 3610 "seclang-parser.cc" +#line 3603 "seclang-parser.cc" break; case 186: // var: VARIABLE_MULTIPART_FILENAME "Dictionary element" -#line 2009 "seclang-parser.yy" +#line 2002 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3618 "seclang-parser.cc" +#line 3611 "seclang-parser.cc" break; case 187: // var: VARIABLE_MULTIPART_FILENAME "Dictionary element, selected by regexp" -#line 2013 "seclang-parser.yy" +#line 2006 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3626 "seclang-parser.cc" +#line 3619 "seclang-parser.cc" break; case 188: // var: VARIABLE_MULTIPART_FILENAME -#line 2017 "seclang-parser.yy" +#line 2010 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartFileName_NoDictElement()); } -#line 3634 "seclang-parser.cc" +#line 3627 "seclang-parser.cc" break; case 189: // var: VARIABLE_MULTIPART_NAME "Dictionary element" -#line 2021 "seclang-parser.yy" +#line 2014 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3642 "seclang-parser.cc" +#line 3635 "seclang-parser.cc" break; case 190: // var: VARIABLE_MULTIPART_NAME "Dictionary element, selected by regexp" -#line 2025 "seclang-parser.yy" +#line 2018 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3650 "seclang-parser.cc" +#line 3643 "seclang-parser.cc" break; case 191: // var: VARIABLE_MULTIPART_NAME -#line 2029 "seclang-parser.yy" +#line 2022 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultiPartName_NoDictElement()); } -#line 3658 "seclang-parser.cc" +#line 3651 "seclang-parser.cc" break; case 192: // var: VARIABLE_MATCHED_VARS_NAMES "Dictionary element" -#line 2033 "seclang-parser.yy" +#line 2026 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3666 "seclang-parser.cc" +#line 3659 "seclang-parser.cc" break; case 193: // var: VARIABLE_MATCHED_VARS_NAMES "Dictionary element, selected by regexp" -#line 2037 "seclang-parser.yy" +#line 2030 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3674 "seclang-parser.cc" +#line 3667 "seclang-parser.cc" break; case 194: // var: VARIABLE_MATCHED_VARS_NAMES -#line 2041 "seclang-parser.yy" +#line 2034 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarsNames_NoDictElement()); } -#line 3682 "seclang-parser.cc" +#line 3675 "seclang-parser.cc" break; case 195: // var: VARIABLE_MATCHED_VARS "Dictionary element" -#line 2045 "seclang-parser.yy" +#line 2038 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3690 "seclang-parser.cc" +#line 3683 "seclang-parser.cc" break; case 196: // var: VARIABLE_MATCHED_VARS "Dictionary element, selected by regexp" -#line 2049 "seclang-parser.yy" +#line 2042 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3698 "seclang-parser.cc" +#line 3691 "seclang-parser.cc" break; case 197: // var: VARIABLE_MATCHED_VARS -#line 2053 "seclang-parser.yy" +#line 2046 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVars_NoDictElement()); } -#line 3706 "seclang-parser.cc" +#line 3699 "seclang-parser.cc" break; case 198: // var: VARIABLE_FILES "Dictionary element" -#line 2057 "seclang-parser.yy" +#line 2050 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3714 "seclang-parser.cc" +#line 3707 "seclang-parser.cc" break; case 199: // var: VARIABLE_FILES "Dictionary element, selected by regexp" -#line 2061 "seclang-parser.yy" +#line 2054 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3722 "seclang-parser.cc" +#line 3715 "seclang-parser.cc" break; case 200: // var: VARIABLE_FILES -#line 2065 "seclang-parser.yy" +#line 2058 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Files_NoDictElement()); } -#line 3730 "seclang-parser.cc" +#line 3723 "seclang-parser.cc" break; case 201: // var: VARIABLE_REQUEST_COOKIES "Dictionary element" -#line 2069 "seclang-parser.yy" +#line 2062 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3738 "seclang-parser.cc" +#line 3731 "seclang-parser.cc" break; case 202: // var: VARIABLE_REQUEST_COOKIES "Dictionary element, selected by regexp" -#line 2073 "seclang-parser.yy" +#line 2066 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3746 "seclang-parser.cc" +#line 3739 "seclang-parser.cc" break; case 203: // var: VARIABLE_REQUEST_COOKIES -#line 2077 "seclang-parser.yy" +#line 2070 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookies_NoDictElement()); } -#line 3754 "seclang-parser.cc" +#line 3747 "seclang-parser.cc" break; case 204: // var: VARIABLE_REQUEST_HEADERS "Dictionary element" -#line 2081 "seclang-parser.yy" +#line 2074 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3762 "seclang-parser.cc" +#line 3755 "seclang-parser.cc" break; case 205: // var: VARIABLE_REQUEST_HEADERS "Dictionary element, selected by regexp" -#line 2085 "seclang-parser.yy" +#line 2078 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3770 "seclang-parser.cc" +#line 3763 "seclang-parser.cc" break; case 206: // var: VARIABLE_REQUEST_HEADERS -#line 2089 "seclang-parser.yy" +#line 2082 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeaders_NoDictElement()); } -#line 3778 "seclang-parser.cc" +#line 3771 "seclang-parser.cc" break; case 207: // var: VARIABLE_RESPONSE_HEADERS "Dictionary element" -#line 2093 "seclang-parser.yy" +#line 2086 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3786 "seclang-parser.cc" +#line 3779 "seclang-parser.cc" break; case 208: // var: VARIABLE_RESPONSE_HEADERS "Dictionary element, selected by regexp" -#line 2097 "seclang-parser.yy" +#line 2090 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3794 "seclang-parser.cc" +#line 3787 "seclang-parser.cc" break; case 209: // var: VARIABLE_RESPONSE_HEADERS -#line 2101 "seclang-parser.yy" +#line 2094 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeaders_NoDictElement()); } -#line 3802 "seclang-parser.cc" +#line 3795 "seclang-parser.cc" break; case 210: // var: VARIABLE_GEO "Dictionary element" -#line 2105 "seclang-parser.yy" +#line 2098 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3810 "seclang-parser.cc" +#line 3803 "seclang-parser.cc" break; case 211: // var: VARIABLE_GEO "Dictionary element, selected by regexp" -#line 2109 "seclang-parser.yy" +#line 2102 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3818 "seclang-parser.cc" +#line 3811 "seclang-parser.cc" break; case 212: // var: VARIABLE_GEO -#line 2113 "seclang-parser.yy" +#line 2106 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Geo_NoDictElement()); } -#line 3826 "seclang-parser.cc" +#line 3819 "seclang-parser.cc" break; case 213: // var: VARIABLE_REQUEST_COOKIES_NAMES "Dictionary element" -#line 2117 "seclang-parser.yy" +#line 2110 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3834 "seclang-parser.cc" +#line 3827 "seclang-parser.cc" break; case 214: // var: VARIABLE_REQUEST_COOKIES_NAMES "Dictionary element, selected by regexp" -#line 2121 "seclang-parser.yy" +#line 2114 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3842 "seclang-parser.cc" +#line 3835 "seclang-parser.cc" break; case 215: // var: VARIABLE_REQUEST_COOKIES_NAMES -#line 2125 "seclang-parser.yy" +#line 2118 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestCookiesNames_NoDictElement()); } -#line 3850 "seclang-parser.cc" +#line 3843 "seclang-parser.cc" break; case 216: // var: VARIABLE_MULTIPART_PART_HEADERS "Dictionary element" -#line 2129 "seclang-parser.yy" +#line 2122 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartPartHeaders_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3858 "seclang-parser.cc" +#line 3851 "seclang-parser.cc" break; case 217: // var: VARIABLE_MULTIPART_PART_HEADERS "Dictionary element, selected by regexp" -#line 2133 "seclang-parser.yy" +#line 2126 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartPartHeaders_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3866 "seclang-parser.cc" +#line 3859 "seclang-parser.cc" break; case 218: // var: VARIABLE_MULTIPART_PART_HEADERS -#line 2137 "seclang-parser.yy" +#line 2130 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartPartHeaders_NoDictElement()); } -#line 3874 "seclang-parser.cc" +#line 3867 "seclang-parser.cc" break; case 219: // var: VARIABLE_RULE "Dictionary element" -#line 2141 "seclang-parser.yy" +#line 2134 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3882 "seclang-parser.cc" +#line 3875 "seclang-parser.cc" break; case 220: // var: VARIABLE_RULE "Dictionary element, selected by regexp" -#line 2145 "seclang-parser.yy" +#line 2138 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3890 "seclang-parser.cc" +#line 3883 "seclang-parser.cc" break; case 221: // var: VARIABLE_RULE -#line 2149 "seclang-parser.yy" +#line 2142 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Rule_NoDictElement()); } -#line 3898 "seclang-parser.cc" +#line 3891 "seclang-parser.cc" break; case 222: // var: "RUN_TIME_VAR_ENV" "Dictionary element" -#line 2153 "seclang-parser.yy" +#line 2146 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV:" + yystack_[0].value.as < std::string > ())); } -#line 3906 "seclang-parser.cc" +#line 3899 "seclang-parser.cc" break; case 223: // var: "RUN_TIME_VAR_ENV" "Dictionary element, selected by regexp" -#line 2157 "seclang-parser.yy" +#line 2150 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV:" + yystack_[0].value.as < std::string > ())); } -#line 3914 "seclang-parser.cc" +#line 3907 "seclang-parser.cc" break; case 224: // var: "RUN_TIME_VAR_ENV" -#line 2161 "seclang-parser.yy" +#line 2154 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Env("ENV")); } -#line 3922 "seclang-parser.cc" +#line 3915 "seclang-parser.cc" break; case 225: // var: "RUN_TIME_VAR_XML" "Dictionary element" -#line 2165 "seclang-parser.yy" +#line 2158 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML("XML:" + yystack_[0].value.as < std::string > ())); } -#line 3930 "seclang-parser.cc" +#line 3923 "seclang-parser.cc" break; case 226: // var: "RUN_TIME_VAR_XML" "Dictionary element, selected by regexp" -#line 2169 "seclang-parser.yy" +#line 2162 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML("XML:" + yystack_[0].value.as < std::string > ())); } -#line 3938 "seclang-parser.cc" +#line 3931 "seclang-parser.cc" break; case 227: // var: "RUN_TIME_VAR_XML" -#line 2173 "seclang-parser.yy" +#line 2166 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::XML_NoDictElement()); } -#line 3946 "seclang-parser.cc" +#line 3939 "seclang-parser.cc" break; case 228: // var: "FILES_TMPNAMES" "Dictionary element" -#line 2177 "seclang-parser.yy" +#line 2170 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3954 "seclang-parser.cc" +#line 3947 "seclang-parser.cc" break; case 229: // var: "FILES_TMPNAMES" "Dictionary element, selected by regexp" -#line 2181 "seclang-parser.yy" +#line 2174 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3962 "seclang-parser.cc" +#line 3955 "seclang-parser.cc" break; case 230: // var: "FILES_TMPNAMES" -#line 2185 "seclang-parser.yy" +#line 2178 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesTmpNames_NoDictElement()); } -#line 3970 "seclang-parser.cc" +#line 3963 "seclang-parser.cc" break; case 231: // var: "RESOURCE" run_time_string -#line 2189 "seclang-parser.yy" +#line 2182 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 3978 "seclang-parser.cc" +#line 3971 "seclang-parser.cc" break; case 232: // var: "RESOURCE" "Dictionary element" -#line 2193 "seclang-parser.yy" +#line 2186 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DictElement(yystack_[0].value.as < std::string > ())); } -#line 3986 "seclang-parser.cc" +#line 3979 "seclang-parser.cc" break; case 233: // var: "RESOURCE" "Dictionary element, selected by regexp" -#line 2197 "seclang-parser.yy" +#line 2190 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 3994 "seclang-parser.cc" +#line 3987 "seclang-parser.cc" break; case 234: // var: "RESOURCE" -#line 2201 "seclang-parser.yy" +#line 2194 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Resource_NoDictElement()); } -#line 4002 "seclang-parser.cc" +#line 3995 "seclang-parser.cc" break; case 235: // var: "VARIABLE_IP" run_time_string -#line 2205 "seclang-parser.yy" +#line 2198 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 4010 "seclang-parser.cc" +#line 4003 "seclang-parser.cc" break; case 236: // var: "VARIABLE_IP" "Dictionary element" -#line 2209 "seclang-parser.yy" +#line 2202 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4018 "seclang-parser.cc" +#line 4011 "seclang-parser.cc" break; case 237: // var: "VARIABLE_IP" "Dictionary element, selected by regexp" -#line 2213 "seclang-parser.yy" +#line 2206 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4026 "seclang-parser.cc" +#line 4019 "seclang-parser.cc" break; case 238: // var: "VARIABLE_IP" -#line 2217 "seclang-parser.yy" +#line 2210 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Ip_NoDictElement()); } -#line 4034 "seclang-parser.cc" +#line 4027 "seclang-parser.cc" break; case 239: // var: "VARIABLE_GLOBAL" run_time_string -#line 2221 "seclang-parser.yy" +#line 2214 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 4042 "seclang-parser.cc" +#line 4035 "seclang-parser.cc" break; case 240: // var: "VARIABLE_GLOBAL" "Dictionary element" -#line 2225 "seclang-parser.yy" +#line 2218 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4050 "seclang-parser.cc" +#line 4043 "seclang-parser.cc" break; case 241: // var: "VARIABLE_GLOBAL" "Dictionary element, selected by regexp" -#line 2229 "seclang-parser.yy" +#line 2222 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4058 "seclang-parser.cc" +#line 4051 "seclang-parser.cc" break; case 242: // var: "VARIABLE_GLOBAL" -#line 2233 "seclang-parser.yy" +#line 2226 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Global_NoDictElement()); } -#line 4066 "seclang-parser.cc" +#line 4059 "seclang-parser.cc" break; case 243: // var: "VARIABLE_USER" run_time_string -#line 2237 "seclang-parser.yy" +#line 2230 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 4074 "seclang-parser.cc" +#line 4067 "seclang-parser.cc" break; case 244: // var: "VARIABLE_USER" "Dictionary element" -#line 2241 "seclang-parser.yy" +#line 2234 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4082 "seclang-parser.cc" +#line 4075 "seclang-parser.cc" break; case 245: // var: "VARIABLE_USER" "Dictionary element, selected by regexp" -#line 2245 "seclang-parser.yy" +#line 2238 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4090 "seclang-parser.cc" +#line 4083 "seclang-parser.cc" break; case 246: // var: "VARIABLE_USER" -#line 2249 "seclang-parser.yy" +#line 2242 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::User_NoDictElement()); } -#line 4098 "seclang-parser.cc" +#line 4091 "seclang-parser.cc" break; case 247: // var: "VARIABLE_TX" run_time_string -#line 2253 "seclang-parser.yy" +#line 2246 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 4106 "seclang-parser.cc" +#line 4099 "seclang-parser.cc" break; case 248: // var: "VARIABLE_TX" "Dictionary element" -#line 2257 "seclang-parser.yy" +#line 2250 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4114 "seclang-parser.cc" +#line 4107 "seclang-parser.cc" break; case 249: // var: "VARIABLE_TX" "Dictionary element, selected by regexp" -#line 2261 "seclang-parser.yy" +#line 2254 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4122 "seclang-parser.cc" +#line 4115 "seclang-parser.cc" break; case 250: // var: "VARIABLE_TX" -#line 2265 "seclang-parser.yy" +#line 2258 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Tx_NoDictElement()); } -#line 4130 "seclang-parser.cc" +#line 4123 "seclang-parser.cc" break; case 251: // var: "VARIABLE_SESSION" run_time_string -#line 2269 "seclang-parser.yy" +#line 2262 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DynamicElement(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 4138 "seclang-parser.cc" +#line 4131 "seclang-parser.cc" break; case 252: // var: "VARIABLE_SESSION" "Dictionary element" -#line 2273 "seclang-parser.yy" +#line 2266 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4146 "seclang-parser.cc" +#line 4139 "seclang-parser.cc" break; case 253: // var: "VARIABLE_SESSION" "Dictionary element, selected by regexp" -#line 2277 "seclang-parser.yy" +#line 2270 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4154 "seclang-parser.cc" +#line 4147 "seclang-parser.cc" break; case 254: // var: "VARIABLE_SESSION" -#line 2281 "seclang-parser.yy" +#line 2274 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Session_NoDictElement()); } -#line 4162 "seclang-parser.cc" +#line 4155 "seclang-parser.cc" break; case 255: // var: "Variable ARGS_NAMES" "Dictionary element" -#line 2285 "seclang-parser.yy" +#line 2278 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4170 "seclang-parser.cc" +#line 4163 "seclang-parser.cc" break; case 256: // var: "Variable ARGS_NAMES" "Dictionary element, selected by regexp" -#line 2289 "seclang-parser.yy" +#line 2282 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4178 "seclang-parser.cc" +#line 4171 "seclang-parser.cc" break; case 257: // var: "Variable ARGS_NAMES" -#line 2293 "seclang-parser.yy" +#line 2286 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsNames_NoDictElement()); } -#line 4186 "seclang-parser.cc" +#line 4179 "seclang-parser.cc" break; case 258: // var: VARIABLE_ARGS_GET_NAMES "Dictionary element" -#line 2297 "seclang-parser.yy" +#line 2290 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4194 "seclang-parser.cc" +#line 4187 "seclang-parser.cc" break; case 259: // var: VARIABLE_ARGS_GET_NAMES "Dictionary element, selected by regexp" -#line 2301 "seclang-parser.yy" +#line 2294 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4202 "seclang-parser.cc" +#line 4195 "seclang-parser.cc" break; case 260: // var: VARIABLE_ARGS_GET_NAMES -#line 2305 "seclang-parser.yy" +#line 2298 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsGetNames_NoDictElement()); } -#line 4210 "seclang-parser.cc" +#line 4203 "seclang-parser.cc" break; case 261: // var: VARIABLE_ARGS_POST_NAMES "Dictionary element" -#line 2310 "seclang-parser.yy" +#line 2303 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4218 "seclang-parser.cc" +#line 4211 "seclang-parser.cc" break; case 262: // var: VARIABLE_ARGS_POST_NAMES "Dictionary element, selected by regexp" -#line 2314 "seclang-parser.yy" +#line 2307 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4226 "seclang-parser.cc" +#line 4219 "seclang-parser.cc" break; case 263: // var: VARIABLE_ARGS_POST_NAMES -#line 2318 "seclang-parser.yy" +#line 2311 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsPostNames_NoDictElement()); } -#line 4234 "seclang-parser.cc" +#line 4227 "seclang-parser.cc" break; case 264: // var: VARIABLE_REQUEST_HEADERS_NAMES "Dictionary element" -#line 2323 "seclang-parser.yy" +#line 2316 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4242 "seclang-parser.cc" +#line 4235 "seclang-parser.cc" break; case 265: // var: VARIABLE_REQUEST_HEADERS_NAMES "Dictionary element, selected by regexp" -#line 2327 "seclang-parser.yy" +#line 2320 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4250 "seclang-parser.cc" +#line 4243 "seclang-parser.cc" break; case 266: // var: VARIABLE_REQUEST_HEADERS_NAMES -#line 2331 "seclang-parser.yy" +#line 2324 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestHeadersNames_NoDictElement()); } -#line 4258 "seclang-parser.cc" +#line 4251 "seclang-parser.cc" break; case 267: // var: VARIABLE_RESPONSE_CONTENT_TYPE -#line 2336 "seclang-parser.yy" +#line 2329 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseContentType()); } -#line 4266 "seclang-parser.cc" +#line 4259 "seclang-parser.cc" break; case 268: // var: VARIABLE_RESPONSE_HEADERS_NAMES "Dictionary element" -#line 2341 "seclang-parser.yy" +#line 2334 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_DictElement(yystack_[0].value.as < std::string > ())); } -#line 4274 "seclang-parser.cc" +#line 4267 "seclang-parser.cc" break; case 269: // var: VARIABLE_RESPONSE_HEADERS_NAMES "Dictionary element, selected by regexp" -#line 2345 "seclang-parser.yy" +#line 2338 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_DictElementRegexp(yystack_[0].value.as < std::string > ())); } -#line 4282 "seclang-parser.cc" +#line 4275 "seclang-parser.cc" break; case 270: // var: VARIABLE_RESPONSE_HEADERS_NAMES -#line 2349 "seclang-parser.yy" +#line 2342 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseHeadersNames_NoDictElement()); } -#line 4290 "seclang-parser.cc" +#line 4283 "seclang-parser.cc" break; case 271: // var: VARIABLE_ARGS_COMBINED_SIZE -#line 2353 "seclang-parser.yy" +#line 2346 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ArgsCombinedSize()); } -#line 4298 "seclang-parser.cc" +#line 4291 "seclang-parser.cc" break; case 272: // var: "AUTH_TYPE" -#line 2357 "seclang-parser.yy" +#line 2350 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::AuthType()); } -#line 4306 "seclang-parser.cc" +#line 4299 "seclang-parser.cc" break; case 273: // var: "FILES_COMBINED_SIZE" -#line 2361 "seclang-parser.yy" +#line 2354 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FilesCombinedSize()); } -#line 4314 "seclang-parser.cc" +#line 4307 "seclang-parser.cc" break; case 274: // var: "FULL_REQUEST" -#line 2365 "seclang-parser.yy" +#line 2358 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FullRequest()); } -#line 4322 "seclang-parser.cc" +#line 4315 "seclang-parser.cc" break; case 275: // var: "FULL_REQUEST_LENGTH" -#line 2369 "seclang-parser.yy" +#line 2362 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::FullRequestLength()); } -#line 4330 "seclang-parser.cc" +#line 4323 "seclang-parser.cc" break; case 276: // var: "INBOUND_DATA_ERROR" -#line 2373 "seclang-parser.yy" +#line 2366 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::InboundDataError()); } -#line 4338 "seclang-parser.cc" +#line 4331 "seclang-parser.cc" break; case 277: // var: "MATCHED_VAR" -#line 2377 "seclang-parser.yy" +#line 2370 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVar()); } -#line 4346 "seclang-parser.cc" +#line 4339 "seclang-parser.cc" break; case 278: // var: "MATCHED_VAR_NAME" -#line 2381 "seclang-parser.yy" +#line 2374 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MatchedVarName()); } -#line 4354 "seclang-parser.cc" +#line 4347 "seclang-parser.cc" break; case 279: // var: "MSC_PCRE_ERROR" -#line 2385 "seclang-parser.yy" +#line 2378 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MscPcreError()); } -#line 4362 "seclang-parser.cc" +#line 4355 "seclang-parser.cc" break; case 280: // var: "MSC_PCRE_LIMITS_EXCEEDED" -#line 2389 "seclang-parser.yy" +#line 2382 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MscPcreLimitsExceeded()); } -#line 4370 "seclang-parser.cc" +#line 4363 "seclang-parser.cc" break; case 281: // var: VARIABLE_MULTIPART_BOUNDARY_QUOTED -#line 2393 "seclang-parser.yy" +#line 2386 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartBoundaryQuoted()); } -#line 4378 "seclang-parser.cc" +#line 4371 "seclang-parser.cc" break; case 282: // var: VARIABLE_MULTIPART_BOUNDARY_WHITESPACE -#line 2397 "seclang-parser.yy" +#line 2390 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartBoundaryWhiteSpace()); } -#line 4386 "seclang-parser.cc" +#line 4379 "seclang-parser.cc" break; case 283: // var: "MULTIPART_CRLF_LF_LINES" -#line 2401 "seclang-parser.yy" +#line 2394 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartCrlfLFLines()); } -#line 4394 "seclang-parser.cc" +#line 4387 "seclang-parser.cc" break; case 284: // var: "MULTIPART_DATA_AFTER" -#line 2405 "seclang-parser.yy" +#line 2398 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartDateAfter()); } -#line 4402 "seclang-parser.cc" +#line 4395 "seclang-parser.cc" break; case 285: // var: VARIABLE_MULTIPART_DATA_BEFORE -#line 2409 "seclang-parser.yy" +#line 2402 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartDateBefore()); } -#line 4410 "seclang-parser.cc" +#line 4403 "seclang-parser.cc" break; case 286: // var: "MULTIPART_FILE_LIMIT_EXCEEDED" -#line 2413 "seclang-parser.yy" +#line 2406 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartFileLimitExceeded()); } -#line 4418 "seclang-parser.cc" +#line 4411 "seclang-parser.cc" break; case 287: // var: "MULTIPART_HEADER_FOLDING" -#line 2417 "seclang-parser.yy" +#line 2410 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartHeaderFolding()); } -#line 4426 "seclang-parser.cc" +#line 4419 "seclang-parser.cc" break; case 288: // var: "MULTIPART_INVALID_HEADER_FOLDING" -#line 2421 "seclang-parser.yy" +#line 2414 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidHeaderFolding()); } -#line 4434 "seclang-parser.cc" +#line 4427 "seclang-parser.cc" break; case 289: // var: VARIABLE_MULTIPART_INVALID_PART -#line 2425 "seclang-parser.yy" +#line 2418 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidPart()); } -#line 4442 "seclang-parser.cc" +#line 4435 "seclang-parser.cc" break; case 290: // var: "MULTIPART_INVALID_QUOTING" -#line 2429 "seclang-parser.yy" +#line 2422 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartInvalidQuoting()); } -#line 4450 "seclang-parser.cc" +#line 4443 "seclang-parser.cc" break; case 291: // var: VARIABLE_MULTIPART_LF_LINE -#line 2433 "seclang-parser.yy" +#line 2426 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartLFLine()); } -#line 4458 "seclang-parser.cc" +#line 4451 "seclang-parser.cc" break; case 292: // var: VARIABLE_MULTIPART_MISSING_SEMICOLON -#line 2437 "seclang-parser.yy" +#line 2430 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartMissingSemicolon()); } -#line 4466 "seclang-parser.cc" +#line 4459 "seclang-parser.cc" break; case 293: // var: VARIABLE_MULTIPART_SEMICOLON_MISSING -#line 2441 "seclang-parser.yy" +#line 2434 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartMissingSemicolon()); } -#line 4474 "seclang-parser.cc" +#line 4467 "seclang-parser.cc" break; case 294: // var: "MULTIPART_STRICT_ERROR" -#line 2445 "seclang-parser.yy" +#line 2438 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartStrictError()); } -#line 4482 "seclang-parser.cc" +#line 4475 "seclang-parser.cc" break; case 295: // var: "MULTIPART_UNMATCHED_BOUNDARY" -#line 2449 "seclang-parser.yy" +#line 2442 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::MultipartUnmatchedBoundary()); } -#line 4490 "seclang-parser.cc" +#line 4483 "seclang-parser.cc" break; case 296: // var: "OUTBOUND_DATA_ERROR" -#line 2453 "seclang-parser.yy" +#line 2446 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::OutboundDataError()); } -#line 4498 "seclang-parser.cc" +#line 4491 "seclang-parser.cc" break; case 297: // var: "PATH_INFO" -#line 2457 "seclang-parser.yy" +#line 2450 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::PathInfo()); } -#line 4506 "seclang-parser.cc" +#line 4499 "seclang-parser.cc" break; case 298: // var: "QUERY_STRING" -#line 2461 "seclang-parser.yy" +#line 2454 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::QueryString()); } -#line 4514 "seclang-parser.cc" +#line 4507 "seclang-parser.cc" break; case 299: // var: "REMOTE_ADDR" -#line 2465 "seclang-parser.yy" +#line 2458 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemoteAddr()); } -#line 4522 "seclang-parser.cc" +#line 4515 "seclang-parser.cc" break; case 300: // var: "REMOTE_HOST" -#line 2469 "seclang-parser.yy" +#line 2462 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemoteHost()); } -#line 4530 "seclang-parser.cc" +#line 4523 "seclang-parser.cc" break; case 301: // var: "REMOTE_PORT" -#line 2473 "seclang-parser.yy" +#line 2466 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RemotePort()); } -#line 4538 "seclang-parser.cc" +#line 4531 "seclang-parser.cc" break; case 302: // var: "REQBODY_ERROR" -#line 2477 "seclang-parser.yy" +#line 2470 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyError()); } -#line 4546 "seclang-parser.cc" +#line 4539 "seclang-parser.cc" break; case 303: // var: "REQBODY_ERROR_MSG" -#line 2481 "seclang-parser.yy" +#line 2474 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyErrorMsg()); } -#line 4554 "seclang-parser.cc" +#line 4547 "seclang-parser.cc" break; case 304: // var: "REQBODY_PROCESSOR" -#line 2485 "seclang-parser.yy" +#line 2478 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessor()); } -#line 4562 "seclang-parser.cc" +#line 4555 "seclang-parser.cc" break; case 305: // var: "REQBODY_PROCESSOR_ERROR" -#line 2489 "seclang-parser.yy" +#line 2482 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessorError()); } -#line 4570 "seclang-parser.cc" +#line 4563 "seclang-parser.cc" break; case 306: // var: "REQBODY_PROCESSOR_ERROR_MSG" -#line 2493 "seclang-parser.yy" +#line 2486 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ReqbodyProcessorErrorMsg()); } -#line 4578 "seclang-parser.cc" +#line 4571 "seclang-parser.cc" break; case 307: // var: "REQUEST_BASENAME" -#line 2497 "seclang-parser.yy" +#line 2490 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBasename()); } -#line 4586 "seclang-parser.cc" +#line 4579 "seclang-parser.cc" break; case 308: // var: "REQUEST_BODY" -#line 2501 "seclang-parser.yy" +#line 2494 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBody()); } -#line 4594 "seclang-parser.cc" +#line 4587 "seclang-parser.cc" break; case 309: // var: "REQUEST_BODY_LENGTH" -#line 2505 "seclang-parser.yy" +#line 2498 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestBodyLength()); } -#line 4602 "seclang-parser.cc" +#line 4595 "seclang-parser.cc" break; case 310: // var: "REQUEST_FILENAME" -#line 2509 "seclang-parser.yy" +#line 2502 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestFilename()); } -#line 4610 "seclang-parser.cc" +#line 4603 "seclang-parser.cc" break; case 311: // var: "REQUEST_LINE" -#line 2513 "seclang-parser.yy" +#line 2506 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestLine()); } -#line 4618 "seclang-parser.cc" +#line 4611 "seclang-parser.cc" break; case 312: // var: "REQUEST_METHOD" -#line 2517 "seclang-parser.yy" +#line 2510 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestMethod()); } -#line 4626 "seclang-parser.cc" +#line 4619 "seclang-parser.cc" break; case 313: // var: "REQUEST_PROTOCOL" -#line 2521 "seclang-parser.yy" +#line 2514 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestProtocol()); } -#line 4634 "seclang-parser.cc" +#line 4627 "seclang-parser.cc" break; case 314: // var: "REQUEST_URI" -#line 2525 "seclang-parser.yy" +#line 2518 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestURI()); } -#line 4642 "seclang-parser.cc" +#line 4635 "seclang-parser.cc" break; case 315: // var: "REQUEST_URI_RAW" -#line 2529 "seclang-parser.yy" +#line 2522 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::RequestURIRaw()); } -#line 4650 "seclang-parser.cc" +#line 4643 "seclang-parser.cc" break; case 316: // var: "RESPONSE_BODY" -#line 2533 "seclang-parser.yy" +#line 2526 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseBody()); } -#line 4658 "seclang-parser.cc" +#line 4651 "seclang-parser.cc" break; case 317: // var: "RESPONSE_CONTENT_LENGTH" -#line 2537 "seclang-parser.yy" +#line 2530 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseContentLength()); } -#line 4666 "seclang-parser.cc" +#line 4659 "seclang-parser.cc" break; case 318: // var: "RESPONSE_PROTOCOL" -#line 2541 "seclang-parser.yy" +#line 2534 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseProtocol()); } -#line 4674 "seclang-parser.cc" +#line 4667 "seclang-parser.cc" break; case 319: // var: "RESPONSE_STATUS" -#line 2545 "seclang-parser.yy" +#line 2538 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ResponseStatus()); } -#line 4682 "seclang-parser.cc" +#line 4675 "seclang-parser.cc" break; case 320: // var: "SERVER_ADDR" -#line 2549 "seclang-parser.yy" +#line 2542 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerAddr()); } -#line 4690 "seclang-parser.cc" +#line 4683 "seclang-parser.cc" break; case 321: // var: "SERVER_NAME" -#line 2553 "seclang-parser.yy" +#line 2546 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerName()); } -#line 4698 "seclang-parser.cc" +#line 4691 "seclang-parser.cc" break; case 322: // var: "SERVER_PORT" -#line 2557 "seclang-parser.yy" +#line 2550 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::ServerPort()); } -#line 4706 "seclang-parser.cc" +#line 4699 "seclang-parser.cc" break; case 323: // var: "SESSIONID" -#line 2561 "seclang-parser.yy" +#line 2554 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::SessionID()); } -#line 4714 "seclang-parser.cc" +#line 4707 "seclang-parser.cc" break; case 324: // var: "UNIQUE_ID" -#line 2565 "seclang-parser.yy" +#line 2558 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UniqueID()); } -#line 4722 "seclang-parser.cc" +#line 4715 "seclang-parser.cc" break; case 325: // var: "URLENCODED_ERROR" -#line 2569 "seclang-parser.yy" +#line 2562 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UrlEncodedError()); } -#line 4730 "seclang-parser.cc" +#line 4723 "seclang-parser.cc" break; case 326: // var: "USERID" -#line 2573 "seclang-parser.yy" +#line 2566 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::UserID()); } -#line 4738 "seclang-parser.cc" +#line 4731 "seclang-parser.cc" break; case 327: // var: "VARIABLE_STATUS" -#line 2577 "seclang-parser.yy" +#line 2570 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Status()); } -#line 4746 "seclang-parser.cc" +#line 4739 "seclang-parser.cc" break; case 328: // var: "VARIABLE_STATUS_LINE" -#line 2581 "seclang-parser.yy" +#line 2574 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::Status()); } -#line 4754 "seclang-parser.cc" +#line 4747 "seclang-parser.cc" break; case 329: // var: "WEBAPPID" -#line 2585 "seclang-parser.yy" +#line 2578 "seclang-parser.yy" { VARIABLE_CONTAINER(yylhs.value.as < std::unique_ptr > (), new variables::WebAppId()); } -#line 4762 "seclang-parser.cc" +#line 4755 "seclang-parser.cc" break; case 330: // var: "RUN_TIME_VAR_DUR" -#line 2589 "seclang-parser.yy" +#line 2582 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new Duration(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4773 "seclang-parser.cc" +#line 4766 "seclang-parser.cc" break; case 331: // var: "RUN_TIME_VAR_BLD" -#line 2597 "seclang-parser.yy" +#line 2590 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new ModsecBuild(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4784 "seclang-parser.cc" +#line 4777 "seclang-parser.cc" break; case 332: // var: "RUN_TIME_VAR_HSV" -#line 2604 "seclang-parser.yy" +#line 2597 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new HighestSeverity(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4795 "seclang-parser.cc" +#line 4788 "seclang-parser.cc" break; case 333: // var: "RUN_TIME_VAR_REMOTE_USER" -#line 2611 "seclang-parser.yy" +#line 2604 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new RemoteUser(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4806 "seclang-parser.cc" +#line 4799 "seclang-parser.cc" break; case 334: // var: "RUN_TIME_VAR_TIME" -#line 2618 "seclang-parser.yy" +#line 2611 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new Time(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4817 "seclang-parser.cc" +#line 4810 "seclang-parser.cc" break; case 335: // var: "RUN_TIME_VAR_TIME_DAY" -#line 2625 "seclang-parser.yy" +#line 2618 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeDay(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4828 "seclang-parser.cc" +#line 4821 "seclang-parser.cc" break; case 336: // var: "RUN_TIME_VAR_TIME_EPOCH" -#line 2632 "seclang-parser.yy" +#line 2625 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeEpoch(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4839 "seclang-parser.cc" +#line 4832 "seclang-parser.cc" break; case 337: // var: "RUN_TIME_VAR_TIME_HOUR" -#line 2639 "seclang-parser.yy" +#line 2632 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeHour(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4850 "seclang-parser.cc" +#line 4843 "seclang-parser.cc" break; case 338: // var: "RUN_TIME_VAR_TIME_MIN" -#line 2646 "seclang-parser.yy" +#line 2639 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeMin(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4861 "seclang-parser.cc" +#line 4854 "seclang-parser.cc" break; case 339: // var: "RUN_TIME_VAR_TIME_MON" -#line 2653 "seclang-parser.yy" +#line 2646 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeMon(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4872 "seclang-parser.cc" +#line 4865 "seclang-parser.cc" break; case 340: // var: "RUN_TIME_VAR_TIME_SEC" -#line 2660 "seclang-parser.yy" +#line 2653 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeSec(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4883 "seclang-parser.cc" +#line 4876 "seclang-parser.cc" break; case 341: // var: "RUN_TIME_VAR_TIME_WDAY" -#line 2667 "seclang-parser.yy" +#line 2660 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeWDay(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4894 "seclang-parser.cc" +#line 4887 "seclang-parser.cc" break; case 342: // var: "RUN_TIME_VAR_TIME_YEAR" -#line 2674 "seclang-parser.yy" +#line 2667 "seclang-parser.yy" { std::string name(yystack_[0].value.as < std::string > ()); char z = name.at(0); std::unique_ptr c(new TimeYear(name)); yylhs.value.as < std::unique_ptr > () = std::move(c); } -#line 4905 "seclang-parser.cc" +#line 4898 "seclang-parser.cc" break; case 343: // act: "Accuracy" -#line 2684 "seclang-parser.yy" +#line 2677 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Accuracy(yystack_[0].value.as < std::string > ())); } -#line 4913 "seclang-parser.cc" +#line 4906 "seclang-parser.cc" break; case 344: // act: "Allow" -#line 2688 "seclang-parser.yy" +#line 2681 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Allow(yystack_[0].value.as < std::string > ())); } -#line 4921 "seclang-parser.cc" +#line 4914 "seclang-parser.cc" break; case 345: // act: "Append" -#line 2692 "seclang-parser.yy" +#line 2685 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Append", yystack_[1].location); } -#line 4929 "seclang-parser.cc" +#line 4922 "seclang-parser.cc" break; case 346: // act: "AuditLog" -#line 2696 "seclang-parser.yy" +#line 2689 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::AuditLog(yystack_[0].value.as < std::string > ())); } -#line 4937 "seclang-parser.cc" +#line 4930 "seclang-parser.cc" break; case 347: // act: "Block" -#line 2700 "seclang-parser.yy" +#line 2693 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Block(yystack_[0].value.as < std::string > ())); } -#line 4945 "seclang-parser.cc" +#line 4938 "seclang-parser.cc" break; case 348: // act: "Capture" -#line 2704 "seclang-parser.yy" +#line 2697 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Capture(yystack_[0].value.as < std::string > ())); } -#line 4953 "seclang-parser.cc" +#line 4946 "seclang-parser.cc" break; case 349: // act: "Chain" -#line 2708 "seclang-parser.yy" +#line 2701 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Chain(yystack_[0].value.as < std::string > ())); } -#line 4961 "seclang-parser.cc" +#line 4954 "seclang-parser.cc" break; case 350: // act: "ACTION_CTL_AUDIT_ENGINE" "CONFIG_VALUE_ON" -#line 2712 "seclang-parser.yy" +#line 2705 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::AuditEngine("ctl:auditengine=on")); driver.m_auditLog->setCtlAuditEngineActive(); } -#line 4970 "seclang-parser.cc" +#line 4963 "seclang-parser.cc" break; case 351: // act: "ACTION_CTL_AUDIT_ENGINE" "CONFIG_VALUE_OFF" -#line 2717 "seclang-parser.yy" +#line 2710 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::AuditEngine("ctl:auditengine=off")); } -#line 4978 "seclang-parser.cc" +#line 4971 "seclang-parser.cc" break; case 352: // act: "ACTION_CTL_AUDIT_ENGINE" "CONFIG_VALUE_RELEVANT_ONLY" -#line 2721 "seclang-parser.yy" +#line 2714 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::AuditEngine("ctl:auditengine=relevantonly")); driver.m_auditLog->setCtlAuditEngineActive(); } -#line 4987 "seclang-parser.cc" +#line 4980 "seclang-parser.cc" break; case 353: // act: "ACTION_CTL_AUDIT_LOG_PARTS" -#line 2726 "seclang-parser.yy" +#line 2719 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::AuditLogParts(yystack_[0].value.as < std::string > ())); } -#line 4995 "seclang-parser.cc" +#line 4988 "seclang-parser.cc" break; case 354: // act: "ACTION_CTL_BDY_JSON" -#line 2730 "seclang-parser.yy" +#line 2723 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorJSON(yystack_[0].value.as < std::string > ())); } -#line 5003 "seclang-parser.cc" +#line 4996 "seclang-parser.cc" break; case 355: // act: "ACTION_CTL_BDY_XML" -#line 2734 "seclang-parser.yy" +#line 2727 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorXML(yystack_[0].value.as < std::string > ())); } -#line 5011 "seclang-parser.cc" +#line 5004 "seclang-parser.cc" break; case 356: // act: "ACTION_CTL_BDY_URLENCODED" -#line 2738 "seclang-parser.yy" +#line 2731 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyProcessorURLENCODED(yystack_[0].value.as < std::string > ())); } -#line 5019 "seclang-parser.cc" +#line 5012 "seclang-parser.cc" break; case 357: // act: "ACTION_CTL_FORCE_REQ_BODY_VAR" "CONFIG_VALUE_ON" -#line 2742 "seclang-parser.yy" +#line 2735 "seclang-parser.yy" { //ACTION_NOT_SUPPORTED("CtlForceReequestBody", @0); ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Action(yystack_[1].value.as < std::string > ())); } -#line 5028 "seclang-parser.cc" +#line 5021 "seclang-parser.cc" break; case 358: // act: "ACTION_CTL_FORCE_REQ_BODY_VAR" "CONFIG_VALUE_OFF" -#line 2747 "seclang-parser.yy" +#line 2740 "seclang-parser.yy" { //ACTION_NOT_SUPPORTED("CtlForceReequestBody", @0); ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Action(yystack_[1].value.as < std::string > ())); } -#line 5037 "seclang-parser.cc" +#line 5030 "seclang-parser.cc" break; case 359: // act: "ACTION_CTL_PARSE_XML_INTO_ARGS" "CONFIG_VALUE_ON" -#line 2752 "seclang-parser.yy" +#line 2745 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::ParseXmlIntoArgs("ctl:parseXmlIntoArgs=on")); } -#line 5045 "seclang-parser.cc" +#line 5038 "seclang-parser.cc" break; case 360: // act: "ACTION_CTL_PARSE_XML_INTO_ARGS" "CONFIG_VALUE_OFF" -#line 2756 "seclang-parser.yy" +#line 2749 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::ParseXmlIntoArgs("ctl:parseXmlIntoArgs=off")); } -#line 5053 "seclang-parser.cc" +#line 5046 "seclang-parser.cc" break; case 361: // act: "ACTION_CTL_PARSE_XML_INTO_ARGS" "CONFIG_VALUE_ONLYARGS" -#line 2760 "seclang-parser.yy" +#line 2753 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::ParseXmlIntoArgs("ctl:parseXmlIntoArgs=onlyargs")); } -#line 5061 "seclang-parser.cc" +#line 5054 "seclang-parser.cc" break; case 362: // act: "ACTION_CTL_REQUEST_BODY_ACCESS" "CONFIG_VALUE_ON" -#line 2764 "seclang-parser.yy" +#line 2757 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyAccess(yystack_[1].value.as < std::string > () + "true")); } -#line 5069 "seclang-parser.cc" +#line 5062 "seclang-parser.cc" break; case 363: // act: "ACTION_CTL_REQUEST_BODY_ACCESS" "CONFIG_VALUE_OFF" -#line 2768 "seclang-parser.yy" +#line 2761 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RequestBodyAccess(yystack_[1].value.as < std::string > () + "false")); } -#line 5077 "seclang-parser.cc" +#line 5070 "seclang-parser.cc" break; case 364: // act: "ACTION_CTL_RULE_ENGINE" "CONFIG_VALUE_ON" -#line 2772 "seclang-parser.yy" +#line 2765 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=on")); } -#line 5085 "seclang-parser.cc" +#line 5078 "seclang-parser.cc" break; case 365: // act: "ACTION_CTL_RULE_ENGINE" "CONFIG_VALUE_OFF" -#line 2776 "seclang-parser.yy" +#line 2769 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=off")); } -#line 5093 "seclang-parser.cc" +#line 5086 "seclang-parser.cc" break; case 366: // act: "ACTION_CTL_RULE_ENGINE" "CONFIG_VALUE_DETC" -#line 2780 "seclang-parser.yy" +#line 2773 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleEngine("ctl:RuleEngine=detectiononly")); } -#line 5101 "seclang-parser.cc" +#line 5094 "seclang-parser.cc" break; case 367: // act: "ACTION_CTL_RULE_REMOVE_BY_ID" -#line 2784 "seclang-parser.yy" +#line 2777 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveById(yystack_[0].value.as < std::string > ())); } -#line 5109 "seclang-parser.cc" +#line 5102 "seclang-parser.cc" break; case 368: // act: "ACTION_CTL_RULE_REMOVE_BY_TAG" -#line 2788 "seclang-parser.yy" +#line 2781 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveByTag(yystack_[0].value.as < std::string > ())); } -#line 5117 "seclang-parser.cc" +#line 5110 "seclang-parser.cc" break; case 369: // act: "ACTION_CTL_RULE_REMOVE_TARGET_BY_ID" -#line 2792 "seclang-parser.yy" +#line 2785 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveTargetById(yystack_[0].value.as < std::string > ())); } -#line 5125 "seclang-parser.cc" +#line 5118 "seclang-parser.cc" break; case 370: // act: "ACTION_CTL_RULE_REMOVE_TARGET_BY_TAG" -#line 2796 "seclang-parser.yy" +#line 2789 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ctl::RuleRemoveTargetByTag(yystack_[0].value.as < std::string > ())); } -#line 5133 "seclang-parser.cc" +#line 5126 "seclang-parser.cc" break; case 371: // act: "Deny" -#line 2800 "seclang-parser.yy" +#line 2793 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Deny(yystack_[0].value.as < std::string > ())); } -#line 5141 "seclang-parser.cc" +#line 5134 "seclang-parser.cc" break; case 372: // act: "DeprecateVar" -#line 2804 "seclang-parser.yy" +#line 2797 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("DeprecateVar", yystack_[1].location); } -#line 5149 "seclang-parser.cc" +#line 5142 "seclang-parser.cc" break; case 373: // act: "Drop" -#line 2808 "seclang-parser.yy" +#line 2801 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Drop(yystack_[0].value.as < std::string > ())); } -#line 5157 "seclang-parser.cc" +#line 5150 "seclang-parser.cc" break; case 374: // act: "Exec" -#line 2812 "seclang-parser.yy" +#line 2805 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Exec(yystack_[0].value.as < std::string > ())); } -#line 5165 "seclang-parser.cc" +#line 5158 "seclang-parser.cc" break; case 375: // act: "ExpireVar" run_time_string -#line 2816 "seclang-parser.yy" +#line 2809 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::ExpireVar(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5173 "seclang-parser.cc" +#line 5166 "seclang-parser.cc" break; case 376: // act: "Id" -#line 2820 "seclang-parser.yy" +#line 2813 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::RuleId(yystack_[0].value.as < std::string > ())); } -#line 5181 "seclang-parser.cc" +#line 5174 "seclang-parser.cc" break; case 377: // act: "InitCol" run_time_string -#line 2824 "seclang-parser.yy" +#line 2817 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::InitCol(yystack_[1].value.as < std::string > (), std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5189 "seclang-parser.cc" +#line 5182 "seclang-parser.cc" break; case 378: // act: "LogData" run_time_string -#line 2828 "seclang-parser.yy" +#line 2821 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::LogData(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5197 "seclang-parser.cc" +#line 5190 "seclang-parser.cc" break; case 379: // act: "Log" -#line 2832 "seclang-parser.yy" +#line 2825 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Log(yystack_[0].value.as < std::string > ())); } -#line 5205 "seclang-parser.cc" +#line 5198 "seclang-parser.cc" break; case 380: // act: "Maturity" -#line 2836 "seclang-parser.yy" +#line 2829 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Maturity(yystack_[0].value.as < std::string > ())); } -#line 5213 "seclang-parser.cc" +#line 5206 "seclang-parser.cc" break; case 381: // act: "Msg" run_time_string -#line 2840 "seclang-parser.yy" +#line 2833 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Msg(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5221 "seclang-parser.cc" +#line 5214 "seclang-parser.cc" break; case 382: // act: "MultiMatch" -#line 2844 "seclang-parser.yy" +#line 2837 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::MultiMatch(yystack_[0].value.as < std::string > ())); } -#line 5229 "seclang-parser.cc" +#line 5222 "seclang-parser.cc" break; case 383: // act: "NoAuditLog" -#line 2848 "seclang-parser.yy" +#line 2841 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::NoAuditLog(yystack_[0].value.as < std::string > ())); } -#line 5237 "seclang-parser.cc" +#line 5230 "seclang-parser.cc" break; case 384: // act: "NoLog" -#line 2852 "seclang-parser.yy" +#line 2845 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::NoLog(yystack_[0].value.as < std::string > ())); } -#line 5245 "seclang-parser.cc" +#line 5238 "seclang-parser.cc" break; case 385: // act: "Pass" -#line 2856 "seclang-parser.yy" +#line 2849 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Pass(yystack_[0].value.as < std::string > ())); } -#line 5253 "seclang-parser.cc" +#line 5246 "seclang-parser.cc" break; case 386: // act: "Pause" -#line 2860 "seclang-parser.yy" +#line 2853 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Pause", yystack_[1].location); } -#line 5261 "seclang-parser.cc" +#line 5254 "seclang-parser.cc" break; case 387: // act: "Phase" -#line 2864 "seclang-parser.yy" +#line 2857 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Phase(yystack_[0].value.as < std::string > ())); } -#line 5269 "seclang-parser.cc" +#line 5262 "seclang-parser.cc" break; case 388: // act: "Prepend" -#line 2868 "seclang-parser.yy" +#line 2861 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Prepend", yystack_[1].location); } -#line 5277 "seclang-parser.cc" +#line 5270 "seclang-parser.cc" break; case 389: // act: "Proxy" -#line 2872 "seclang-parser.yy" +#line 2865 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("Proxy", yystack_[1].location); } -#line 5285 "seclang-parser.cc" +#line 5278 "seclang-parser.cc" break; case 390: // act: "Redirect" run_time_string -#line 2876 "seclang-parser.yy" +#line 2869 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::disruptive::Redirect(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5293 "seclang-parser.cc" +#line 5286 "seclang-parser.cc" break; case 391: // act: "Rev" -#line 2880 "seclang-parser.yy" +#line 2873 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Rev(yystack_[0].value.as < std::string > ())); } -#line 5301 "seclang-parser.cc" +#line 5294 "seclang-parser.cc" break; case 392: // act: "SanitiseArg" -#line 2884 "seclang-parser.yy" +#line 2877 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseArg", yystack_[1].location); } -#line 5309 "seclang-parser.cc" +#line 5302 "seclang-parser.cc" break; case 393: // act: "SanitiseMatched" -#line 2888 "seclang-parser.yy" +#line 2881 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseMatched", yystack_[1].location); } -#line 5317 "seclang-parser.cc" +#line 5310 "seclang-parser.cc" break; case 394: // act: "SanitiseMatchedBytes" -#line 2892 "seclang-parser.yy" +#line 2885 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseMatchedBytes", yystack_[1].location); } -#line 5325 "seclang-parser.cc" +#line 5318 "seclang-parser.cc" break; case 395: // act: "SanitiseRequestHeader" -#line 2896 "seclang-parser.yy" +#line 2889 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseRequestHeader", yystack_[1].location); } -#line 5333 "seclang-parser.cc" +#line 5326 "seclang-parser.cc" break; case 396: // act: "SanitiseResponseHeader" -#line 2900 "seclang-parser.yy" +#line 2893 "seclang-parser.yy" { ACTION_NOT_SUPPORTED("SanitiseResponseHeader", yystack_[1].location); } -#line 5341 "seclang-parser.cc" +#line 5334 "seclang-parser.cc" break; case 397: // act: "SetEnv" run_time_string -#line 2904 "seclang-parser.yy" +#line 2897 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetENV(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5349 "seclang-parser.cc" +#line 5342 "seclang-parser.cc" break; case 398: // act: "SetRsc" run_time_string -#line 2908 "seclang-parser.yy" +#line 2901 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetRSC(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5357 "seclang-parser.cc" +#line 5350 "seclang-parser.cc" break; case 399: // act: "SetSid" run_time_string -#line 2912 "seclang-parser.yy" +#line 2905 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetSID(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5365 "seclang-parser.cc" +#line 5358 "seclang-parser.cc" break; case 400: // act: "SetUID" run_time_string -#line 2916 "seclang-parser.yy" +#line 2909 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetUID(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5373 "seclang-parser.cc" +#line 5366 "seclang-parser.cc" break; case 401: // act: "SetVar" setvar_action -#line 2920 "seclang-parser.yy" +#line 2913 "seclang-parser.yy" { yylhs.value.as < std::unique_ptr > () = std::move(yystack_[0].value.as < std::unique_ptr > ()); } -#line 5381 "seclang-parser.cc" +#line 5374 "seclang-parser.cc" break; case 402: // act: "Severity" -#line 2924 "seclang-parser.yy" +#line 2917 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Severity(yystack_[0].value.as < std::string > ())); } -#line 5389 "seclang-parser.cc" +#line 5382 "seclang-parser.cc" break; case 403: // act: "Skip" -#line 2928 "seclang-parser.yy" +#line 2921 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Skip(yystack_[0].value.as < std::string > ())); } -#line 5397 "seclang-parser.cc" +#line 5390 "seclang-parser.cc" break; case 404: // act: "SkipAfter" -#line 2932 "seclang-parser.yy" +#line 2925 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SkipAfter(yystack_[0].value.as < std::string > ())); } -#line 5405 "seclang-parser.cc" +#line 5398 "seclang-parser.cc" break; case 405: // act: "Status" -#line 2936 "seclang-parser.yy" +#line 2929 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::data::Status(yystack_[0].value.as < std::string > ())); } -#line 5413 "seclang-parser.cc" +#line 5406 "seclang-parser.cc" break; case 406: // act: "Tag" run_time_string -#line 2940 "seclang-parser.yy" +#line 2933 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Tag(std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5421 "seclang-parser.cc" +#line 5414 "seclang-parser.cc" break; case 407: // act: "Ver" -#line 2944 "seclang-parser.yy" +#line 2937 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::Ver(yystack_[0].value.as < std::string > ())); } -#line 5429 "seclang-parser.cc" +#line 5422 "seclang-parser.cc" break; case 408: // act: "xmlns" -#line 2948 "seclang-parser.yy" +#line 2941 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::XmlNS(yystack_[0].value.as < std::string > ())); } -#line 5437 "seclang-parser.cc" +#line 5430 "seclang-parser.cc" break; case 409: // act: "ACTION_TRANSFORMATION_PARITY_ZERO_7_BIT" -#line 2952 "seclang-parser.yy" +#line 2945 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityZero7bit(yystack_[0].value.as < std::string > ())); } -#line 5445 "seclang-parser.cc" +#line 5438 "seclang-parser.cc" break; case 410: // act: "ACTION_TRANSFORMATION_PARITY_ODD_7_BIT" -#line 2956 "seclang-parser.yy" +#line 2949 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityOdd7bit(yystack_[0].value.as < std::string > ())); } -#line 5453 "seclang-parser.cc" +#line 5446 "seclang-parser.cc" break; case 411: // act: "ACTION_TRANSFORMATION_PARITY_EVEN_7_BIT" -#line 2960 "seclang-parser.yy" +#line 2953 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ParityEven7bit(yystack_[0].value.as < std::string > ())); } -#line 5461 "seclang-parser.cc" +#line 5454 "seclang-parser.cc" break; case 412: // act: "ACTION_TRANSFORMATION_SQL_HEX_DECODE" -#line 2964 "seclang-parser.yy" +#line 2957 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::SqlHexDecode(yystack_[0].value.as < std::string > ())); } -#line 5469 "seclang-parser.cc" +#line 5462 "seclang-parser.cc" break; case 413: // act: "ACTION_TRANSFORMATION_BASE_64_ENCODE" -#line 2968 "seclang-parser.yy" +#line 2961 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64Encode(yystack_[0].value.as < std::string > ())); } -#line 5477 "seclang-parser.cc" +#line 5470 "seclang-parser.cc" break; case 414: // act: "ACTION_TRANSFORMATION_BASE_64_DECODE" -#line 2972 "seclang-parser.yy" +#line 2965 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64Decode(yystack_[0].value.as < std::string > ())); } -#line 5485 "seclang-parser.cc" +#line 5478 "seclang-parser.cc" break; case 415: // act: "ACTION_TRANSFORMATION_BASE_64_DECODE_EXT" -#line 2976 "seclang-parser.yy" +#line 2969 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Base64DecodeExt(yystack_[0].value.as < std::string > ())); } -#line 5493 "seclang-parser.cc" +#line 5486 "seclang-parser.cc" break; case 416: // act: "ACTION_TRANSFORMATION_CMD_LINE" -#line 2980 "seclang-parser.yy" +#line 2973 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CmdLine(yystack_[0].value.as < std::string > ())); } -#line 5501 "seclang-parser.cc" +#line 5494 "seclang-parser.cc" break; case 417: // act: "ACTION_TRANSFORMATION_SHA1" -#line 2984 "seclang-parser.yy" +#line 2977 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Sha1(yystack_[0].value.as < std::string > ())); } -#line 5509 "seclang-parser.cc" +#line 5502 "seclang-parser.cc" break; case 418: // act: "ACTION_TRANSFORMATION_MD5" -#line 2988 "seclang-parser.yy" +#line 2981 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Md5(yystack_[0].value.as < std::string > ())); } -#line 5517 "seclang-parser.cc" +#line 5510 "seclang-parser.cc" break; case 419: // act: "ACTION_TRANSFORMATION_ESCAPE_SEQ_DECODE" -#line 2992 "seclang-parser.yy" +#line 2985 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::EscapeSeqDecode(yystack_[0].value.as < std::string > ())); } -#line 5525 "seclang-parser.cc" +#line 5518 "seclang-parser.cc" break; case 420: // act: "ACTION_TRANSFORMATION_HEX_ENCODE" -#line 2996 "seclang-parser.yy" +#line 2989 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HexEncode(yystack_[0].value.as < std::string > ())); } -#line 5533 "seclang-parser.cc" +#line 5526 "seclang-parser.cc" break; case 421: // act: "ACTION_TRANSFORMATION_HEX_DECODE" -#line 3000 "seclang-parser.yy" +#line 2993 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HexDecode(yystack_[0].value.as < std::string > ())); } -#line 5541 "seclang-parser.cc" +#line 5534 "seclang-parser.cc" break; case 422: // act: "ACTION_TRANSFORMATION_LOWERCASE" -#line 3004 "seclang-parser.yy" +#line 2997 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::LowerCase(yystack_[0].value.as < std::string > ())); } -#line 5549 "seclang-parser.cc" +#line 5542 "seclang-parser.cc" break; case 423: // act: "ACTION_TRANSFORMATION_UPPERCASE" -#line 3008 "seclang-parser.yy" +#line 3001 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UpperCase(yystack_[0].value.as < std::string > ())); } -#line 5557 "seclang-parser.cc" +#line 5550 "seclang-parser.cc" break; case 424: // act: "ACTION_TRANSFORMATION_URL_DECODE_UNI" -#line 3012 "seclang-parser.yy" +#line 3005 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlDecodeUni(yystack_[0].value.as < std::string > ())); } -#line 5565 "seclang-parser.cc" +#line 5558 "seclang-parser.cc" break; case 425: // act: "ACTION_TRANSFORMATION_URL_DECODE" -#line 3016 "seclang-parser.yy" +#line 3009 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlDecode(yystack_[0].value.as < std::string > ())); } -#line 5573 "seclang-parser.cc" +#line 5566 "seclang-parser.cc" break; case 426: // act: "ACTION_TRANSFORMATION_URL_ENCODE" -#line 3020 "seclang-parser.yy" +#line 3013 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::UrlEncode(yystack_[0].value.as < std::string > ())); } -#line 5581 "seclang-parser.cc" +#line 5574 "seclang-parser.cc" break; case 427: // act: "ACTION_TRANSFORMATION_NONE" -#line 3024 "seclang-parser.yy" +#line 3017 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::None(yystack_[0].value.as < std::string > ())); } -#line 5589 "seclang-parser.cc" +#line 5582 "seclang-parser.cc" break; case 428: // act: "ACTION_TRANSFORMATION_COMPRESS_WHITESPACE" -#line 3028 "seclang-parser.yy" +#line 3021 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CompressWhitespace(yystack_[0].value.as < std::string > ())); } -#line 5597 "seclang-parser.cc" +#line 5590 "seclang-parser.cc" break; case 429: // act: "ACTION_TRANSFORMATION_REMOVE_WHITESPACE" -#line 3032 "seclang-parser.yy" +#line 3025 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveWhitespace(yystack_[0].value.as < std::string > ())); } -#line 5605 "seclang-parser.cc" +#line 5598 "seclang-parser.cc" break; case 430: // act: "ACTION_TRANSFORMATION_REPLACE_NULLS" -#line 3036 "seclang-parser.yy" +#line 3029 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ReplaceNulls(yystack_[0].value.as < std::string > ())); } -#line 5613 "seclang-parser.cc" +#line 5606 "seclang-parser.cc" break; case 431: // act: "ACTION_TRANSFORMATION_REMOVE_NULLS" -#line 3040 "seclang-parser.yy" +#line 3033 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveNulls(yystack_[0].value.as < std::string > ())); } -#line 5621 "seclang-parser.cc" +#line 5614 "seclang-parser.cc" break; case 432: // act: "ACTION_TRANSFORMATION_HTML_ENTITY_DECODE" -#line 3044 "seclang-parser.yy" +#line 3037 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::HtmlEntityDecode(yystack_[0].value.as < std::string > ())); } -#line 5629 "seclang-parser.cc" +#line 5622 "seclang-parser.cc" break; case 433: // act: "ACTION_TRANSFORMATION_JS_DECODE" -#line 3048 "seclang-parser.yy" +#line 3041 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::JsDecode(yystack_[0].value.as < std::string > ())); } -#line 5637 "seclang-parser.cc" +#line 5630 "seclang-parser.cc" break; case 434: // act: "ACTION_TRANSFORMATION_CSS_DECODE" -#line 3052 "seclang-parser.yy" +#line 3045 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::CssDecode(yystack_[0].value.as < std::string > ())); } -#line 5645 "seclang-parser.cc" +#line 5638 "seclang-parser.cc" break; case 435: // act: "ACTION_TRANSFORMATION_TRIM" -#line 3056 "seclang-parser.yy" +#line 3049 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Trim(yystack_[0].value.as < std::string > ())); } -#line 5653 "seclang-parser.cc" +#line 5646 "seclang-parser.cc" break; case 436: // act: "ACTION_TRANSFORMATION_TRIM_LEFT" -#line 3060 "seclang-parser.yy" +#line 3053 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::TrimLeft(yystack_[0].value.as < std::string > ())); } -#line 5661 "seclang-parser.cc" +#line 5654 "seclang-parser.cc" break; case 437: // act: "ACTION_TRANSFORMATION_TRIM_RIGHT" -#line 3064 "seclang-parser.yy" +#line 3057 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::TrimRight(yystack_[0].value.as < std::string > ())); } -#line 5669 "seclang-parser.cc" +#line 5662 "seclang-parser.cc" break; case 438: // act: "ACTION_TRANSFORMATION_NORMALISE_PATH_WIN" -#line 3068 "seclang-parser.yy" +#line 3061 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::NormalisePathWin(yystack_[0].value.as < std::string > ())); } -#line 5677 "seclang-parser.cc" +#line 5670 "seclang-parser.cc" break; case 439: // act: "ACTION_TRANSFORMATION_NORMALISE_PATH" -#line 3072 "seclang-parser.yy" +#line 3065 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::NormalisePath(yystack_[0].value.as < std::string > ())); } -#line 5685 "seclang-parser.cc" +#line 5678 "seclang-parser.cc" break; case 440: // act: "ACTION_TRANSFORMATION_LENGTH" -#line 3076 "seclang-parser.yy" +#line 3069 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Length(yystack_[0].value.as < std::string > ())); } -#line 5693 "seclang-parser.cc" +#line 5686 "seclang-parser.cc" break; case 441: // act: "ACTION_TRANSFORMATION_UTF8_TO_UNICODE" -#line 3080 "seclang-parser.yy" +#line 3073 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::Utf8ToUnicode(yystack_[0].value.as < std::string > ())); } -#line 5701 "seclang-parser.cc" +#line 5694 "seclang-parser.cc" break; case 442: // act: "ACTION_TRANSFORMATION_REMOVE_COMMENTS_CHAR" -#line 3084 "seclang-parser.yy" +#line 3077 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveCommentsChar(yystack_[0].value.as < std::string > ())); } -#line 5709 "seclang-parser.cc" +#line 5702 "seclang-parser.cc" break; case 443: // act: "ACTION_TRANSFORMATION_REMOVE_COMMENTS" -#line 3088 "seclang-parser.yy" +#line 3081 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::RemoveComments(yystack_[0].value.as < std::string > ())); } -#line 5717 "seclang-parser.cc" +#line 5710 "seclang-parser.cc" break; case 444: // act: "ACTION_TRANSFORMATION_REPLACE_COMMENTS" -#line 3092 "seclang-parser.yy" +#line 3085 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::transformations::ReplaceComments(yystack_[0].value.as < std::string > ())); } -#line 5725 "seclang-parser.cc" +#line 5718 "seclang-parser.cc" break; case 445: // setvar_action: "NOT" var -#line 3099 "seclang-parser.yy" +#line 3092 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::unsetOperation, std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5733 "seclang-parser.cc" +#line 5726 "seclang-parser.cc" break; case 446: // setvar_action: var -#line 3103 "seclang-parser.yy" +#line 3096 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::setToOneOperation, std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5741 "seclang-parser.cc" +#line 5734 "seclang-parser.cc" break; case 447: // setvar_action: var SETVAR_OPERATION_EQUALS run_time_string -#line 3107 "seclang-parser.yy" +#line 3100 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::setOperation, std::move(yystack_[2].value.as < std::unique_ptr > ()), std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5749 "seclang-parser.cc" +#line 5742 "seclang-parser.cc" break; case 448: // setvar_action: var SETVAR_OPERATION_EQUALS_PLUS run_time_string -#line 3111 "seclang-parser.yy" +#line 3104 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::sumAndSetOperation, std::move(yystack_[2].value.as < std::unique_ptr > ()), std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5757 "seclang-parser.cc" +#line 5750 "seclang-parser.cc" break; case 449: // setvar_action: var SETVAR_OPERATION_EQUALS_MINUS run_time_string -#line 3115 "seclang-parser.yy" +#line 3108 "seclang-parser.yy" { ACTION_CONTAINER(yylhs.value.as < std::unique_ptr > (), new actions::SetVar(actions::SetVarOperation::substractAndSetOperation, std::move(yystack_[2].value.as < std::unique_ptr > ()), std::move(yystack_[0].value.as < std::unique_ptr > ()))); } -#line 5765 "seclang-parser.cc" +#line 5758 "seclang-parser.cc" break; case 450: // run_time_string: run_time_string "FREE_TEXT_QUOTE_MACRO_EXPANSION" -#line 3122 "seclang-parser.yy" +#line 3115 "seclang-parser.yy" { yystack_[1].value.as < std::unique_ptr > ()->appendText(yystack_[0].value.as < std::string > ()); yylhs.value.as < std::unique_ptr > () = std::move(yystack_[1].value.as < std::unique_ptr > ()); } -#line 5774 "seclang-parser.cc" +#line 5767 "seclang-parser.cc" break; case 451: // run_time_string: run_time_string var -#line 3127 "seclang-parser.yy" +#line 3120 "seclang-parser.yy" { yystack_[1].value.as < std::unique_ptr > ()->appendVar(std::move(yystack_[0].value.as < std::unique_ptr > ())); yylhs.value.as < std::unique_ptr > () = std::move(yystack_[1].value.as < std::unique_ptr > ()); } -#line 5783 "seclang-parser.cc" +#line 5776 "seclang-parser.cc" break; case 452: // run_time_string: "FREE_TEXT_QUOTE_MACRO_EXPANSION" -#line 3132 "seclang-parser.yy" +#line 3125 "seclang-parser.yy" { std::unique_ptr r(new RunTimeString()); r->appendText(yystack_[0].value.as < std::string > ()); yylhs.value.as < std::unique_ptr > () = std::move(r); } -#line 5793 "seclang-parser.cc" +#line 5786 "seclang-parser.cc" break; case 453: // run_time_string: var -#line 3138 "seclang-parser.yy" +#line 3131 "seclang-parser.yy" { std::unique_ptr r(new RunTimeString()); r->appendVar(std::move(yystack_[0].value.as < std::unique_ptr > ())); yylhs.value.as < std::unique_ptr > () = std::move(r); } -#line 5803 "seclang-parser.cc" +#line 5796 "seclang-parser.cc" break; -#line 5807 "seclang-parser.cc" +#line 5800 "seclang-parser.cc" default: break; @@ -7348,44 +7341,44 @@ namespace yy { 999, 1003, 1007, 1011, 1016, 1021, 1025, 1029, 1033, 1037, 1041, 1045, 1049, 1053, 1057, 1061, 1065, 1069, 1073, 1077, 1081, 1085, 1089, 1093, 1097, 1111, 1112, 1143, 1162, 1182, - 1211, 1268, 1275, 1279, 1283, 1287, 1291, 1295, 1299, 1303, - 1312, 1316, 1321, 1324, 1329, 1334, 1339, 1344, 1347, 1352, - 1355, 1360, 1365, 1368, 1373, 1378, 1383, 1388, 1393, 1398, - 1403, 1406, 1411, 1416, 1421, 1426, 1429, 1434, 1439, 1444, - 1457, 1470, 1483, 1496, 1509, 1535, 1563, 1575, 1595, 1622, - 1627, 1633, 1641, 1649, 1658, 1666, 1670, 1674, 1678, 1682, - 1686, 1690, 1695, 1703, 1715, 1721, 1725, 1729, 1733, 1737, - 1741, 1752, 1761, 1762, 1769, 1774, 1779, 1833, 1840, 1848, - 1885, 1889, 1896, 1901, 1907, 1913, 1919, 1926, 1936, 1940, - 1944, 1948, 1952, 1956, 1960, 1964, 1968, 1972, 1976, 1980, - 1984, 1988, 1992, 1996, 2000, 2004, 2008, 2012, 2016, 2020, - 2024, 2028, 2032, 2036, 2040, 2044, 2048, 2052, 2056, 2060, - 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2100, - 2104, 2108, 2112, 2116, 2120, 2124, 2128, 2132, 2136, 2140, - 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176, 2180, - 2184, 2188, 2192, 2196, 2200, 2204, 2208, 2212, 2216, 2220, - 2224, 2228, 2232, 2236, 2240, 2244, 2248, 2252, 2256, 2260, - 2264, 2268, 2272, 2276, 2280, 2284, 2288, 2292, 2296, 2300, - 2304, 2309, 2313, 2317, 2322, 2326, 2330, 2335, 2340, 2344, - 2348, 2352, 2356, 2360, 2364, 2368, 2372, 2376, 2380, 2384, - 2388, 2392, 2396, 2400, 2404, 2408, 2412, 2416, 2420, 2424, - 2428, 2432, 2436, 2440, 2444, 2448, 2452, 2456, 2460, 2464, - 2468, 2472, 2476, 2480, 2484, 2488, 2492, 2496, 2500, 2504, - 2508, 2512, 2516, 2520, 2524, 2528, 2532, 2536, 2540, 2544, - 2548, 2552, 2556, 2560, 2564, 2568, 2572, 2576, 2580, 2584, - 2588, 2596, 2603, 2610, 2617, 2624, 2631, 2638, 2645, 2652, - 2659, 2666, 2673, 2683, 2687, 2691, 2695, 2699, 2703, 2707, - 2711, 2716, 2720, 2725, 2729, 2733, 2737, 2741, 2746, 2751, - 2755, 2759, 2763, 2767, 2771, 2775, 2779, 2783, 2787, 2791, - 2795, 2799, 2803, 2807, 2811, 2815, 2819, 2823, 2827, 2831, - 2835, 2839, 2843, 2847, 2851, 2855, 2859, 2863, 2867, 2871, - 2875, 2879, 2883, 2887, 2891, 2895, 2899, 2903, 2907, 2911, - 2915, 2919, 2923, 2927, 2931, 2935, 2939, 2943, 2947, 2951, - 2955, 2959, 2963, 2967, 2971, 2975, 2979, 2983, 2987, 2991, - 2995, 2999, 3003, 3007, 3011, 3015, 3019, 3023, 3027, 3031, - 3035, 3039, 3043, 3047, 3051, 3055, 3059, 3063, 3067, 3071, - 3075, 3079, 3083, 3087, 3091, 3098, 3102, 3106, 3110, 3114, - 3121, 3126, 3131, 3137 + 1211, 1261, 1268, 1272, 1276, 1280, 1284, 1288, 1292, 1296, + 1305, 1309, 1314, 1317, 1322, 1327, 1332, 1337, 1340, 1345, + 1348, 1353, 1358, 1361, 1366, 1371, 1376, 1381, 1386, 1391, + 1396, 1399, 1404, 1409, 1414, 1419, 1422, 1427, 1432, 1437, + 1450, 1463, 1476, 1489, 1502, 1528, 1556, 1568, 1588, 1615, + 1620, 1626, 1634, 1642, 1651, 1659, 1663, 1667, 1671, 1675, + 1679, 1683, 1688, 1696, 1708, 1714, 1718, 1722, 1726, 1730, + 1734, 1745, 1754, 1755, 1762, 1767, 1772, 1826, 1833, 1841, + 1878, 1882, 1889, 1894, 1900, 1906, 1912, 1919, 1929, 1933, + 1937, 1941, 1945, 1949, 1953, 1957, 1961, 1965, 1969, 1973, + 1977, 1981, 1985, 1989, 1993, 1997, 2001, 2005, 2009, 2013, + 2017, 2021, 2025, 2029, 2033, 2037, 2041, 2045, 2049, 2053, + 2057, 2061, 2065, 2069, 2073, 2077, 2081, 2085, 2089, 2093, + 2097, 2101, 2105, 2109, 2113, 2117, 2121, 2125, 2129, 2133, + 2137, 2141, 2145, 2149, 2153, 2157, 2161, 2165, 2169, 2173, + 2177, 2181, 2185, 2189, 2193, 2197, 2201, 2205, 2209, 2213, + 2217, 2221, 2225, 2229, 2233, 2237, 2241, 2245, 2249, 2253, + 2257, 2261, 2265, 2269, 2273, 2277, 2281, 2285, 2289, 2293, + 2297, 2302, 2306, 2310, 2315, 2319, 2323, 2328, 2333, 2337, + 2341, 2345, 2349, 2353, 2357, 2361, 2365, 2369, 2373, 2377, + 2381, 2385, 2389, 2393, 2397, 2401, 2405, 2409, 2413, 2417, + 2421, 2425, 2429, 2433, 2437, 2441, 2445, 2449, 2453, 2457, + 2461, 2465, 2469, 2473, 2477, 2481, 2485, 2489, 2493, 2497, + 2501, 2505, 2509, 2513, 2517, 2521, 2525, 2529, 2533, 2537, + 2541, 2545, 2549, 2553, 2557, 2561, 2565, 2569, 2573, 2577, + 2581, 2589, 2596, 2603, 2610, 2617, 2624, 2631, 2638, 2645, + 2652, 2659, 2666, 2676, 2680, 2684, 2688, 2692, 2696, 2700, + 2704, 2709, 2713, 2718, 2722, 2726, 2730, 2734, 2739, 2744, + 2748, 2752, 2756, 2760, 2764, 2768, 2772, 2776, 2780, 2784, + 2788, 2792, 2796, 2800, 2804, 2808, 2812, 2816, 2820, 2824, + 2828, 2832, 2836, 2840, 2844, 2848, 2852, 2856, 2860, 2864, + 2868, 2872, 2876, 2880, 2884, 2888, 2892, 2896, 2900, 2904, + 2908, 2912, 2916, 2920, 2924, 2928, 2932, 2936, 2940, 2944, + 2948, 2952, 2956, 2960, 2964, 2968, 2972, 2976, 2980, 2984, + 2988, 2992, 2996, 3000, 3004, 3008, 3012, 3016, 3020, 3024, + 3028, 3032, 3036, 3040, 3044, 3048, 3052, 3056, 3060, 3064, + 3068, 3072, 3076, 3080, 3084, 3091, 3095, 3099, 3103, 3107, + 3114, 3119, 3124, 3130 }; void @@ -7417,9 +7410,9 @@ namespace yy { } // yy -#line 7421 "seclang-parser.cc" +#line 7414 "seclang-parser.cc" -#line 3144 "seclang-parser.yy" +#line 3137 "seclang-parser.yy" void yy::seclang_parser::error (const location_type& l, const std::string& m) { diff --git a/src/parser/seclang-parser.yy b/src/parser/seclang-parser.yy index c3aa5bc4bc..1b9a4f2794 100644 --- a/src/parser/seclang-parser.yy +++ b/src/parser/seclang-parser.yy @@ -1211,14 +1211,11 @@ expression: | CONFIG_DIR_SEC_DEFAULT_ACTION actions { bool hasDisruptive = false; - std::vector *actions = new std::vector(); - for (auto &i : *$2.get()) { - actions->push_back(i.release()); - } - std::vector checkedActions; + std::vector> checkedActions; int definedPhase = -1; int secRuleDefinedPhase = -1; - for (actions::Action *a : *actions) { + for (auto &i : *$2.get()) { + actions::Action *a = i.get(); actions::Phase *phase = dynamic_cast(a); if (a->isDisruptive() == true && dynamic_cast(a) == NULL) { hasDisruptive = true; @@ -1226,7 +1223,6 @@ expression: if (phase != NULL) { definedPhase = phase->m_phase; secRuleDefinedPhase = phase->m_secRulesPhase; - delete phase; } else if (a->action_kind == actions::Action::Kind::RunTimeOnlyIfMatchKind || a->action_kind == actions::Action::Kind::RunTimeBeforeMatchAttemptKind) { actions::transformations::None *none = dynamic_cast(a); @@ -1234,7 +1230,7 @@ expression: driver.error(@0, "The transformation none is not suitable to be part of the SecDefaultActions"); YYERROR; } - checkedActions.push_back(a); + checkedActions.push_back(std::move(i)); } else { driver.error(@0, "The action '" + *a->m_name.get() + "' is not suitable to be part of the SecDefaultActions"); YYERROR; @@ -1258,12 +1254,9 @@ expression: YYERROR; } - for (actions::Action *a : checkedActions) { - driver.m_defaultActions[definedPhase].push_back( - std::unique_ptr(a)); + for (auto &a : checkedActions) { + driver.m_defaultActions[definedPhase].push_back(std::move(a)); } - - delete actions; } | CONFIG_DIR_SEC_MARKER { diff --git a/test/test-cases/regression/config-secdefaultaction.json b/test/test-cases/regression/config-secdefaultaction.json index 9a0ef824d8..270539ea26 100644 --- a/test/test-cases/regression/config-secdefaultaction.json +++ b/test/test-cases/regression/config-secdefaultaction.json @@ -369,5 +369,47 @@ "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"phase:2,id:1,block\"", "SecRule TX \"@contains to_test\" \"id:2,t:lowercase,t:none,block\"" ] + }, + { + "enabled": 1, + "version_min": 300000, + "version_max": 0, + "title": "Testing action :: SecDefaultAction: without a disruptive action", + "client": { + "ip": "", + "port": 0 + }, + "server": { + "ip": "", + "port": 0 + }, + "request": { + "headers": { + "Content-Length": "0" + }, + "uri": "", + "method": "", + "body": [ + "" + ] + }, + "response": { + "headers": { + "Content-Length": "0" + }, + "body": [ + "" + ] + }, + "expected": { + "http_code": 200, + "parser_error": "SecDefaultAction must specify a disruptive action." + }, + "rules": [ + "SecRuleEngine On", + "SecDefaultAction \"phase:2,log,auditlog,t:lowercase,t:urlDecode\"", + "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,msg:'This is a test'\"", + "SecRule TX \"@contains to_test\" \"id:2,t:lowercase,t:none\"" + ] } ] From c9c963eaa32e5d747a7036e099984a4a9b02f90e Mon Sep 17 00:00:00 2001 From: Tom Sommer Date: Sat, 19 Sep 2026 16:29:05 +0200 Subject: [PATCH 2/2] Fix memory leak when a rule repeats msg, logdata or severity RuleWithActions keeps a single pointer for each of the msg, logdata and severity actions and deletes them in its destructor, but the constructor assigned over whatever was already stored there. A rule that names one of those actions more than once, for example SecRule ARGS "@contains x" "id:1,phase:2,pass,msg:'a',msg:'b'" therefore leaked one Action (and the RunTimeString it owns) per rule, per parse. Rule sets are re-parsed on every nginx reload and on every nginx configuration test, so the loss accumulates in the master process. Delete the previous action before storing the new one. The last occurrence still wins, which is the behaviour that was already in place. --- src/rule_with_actions.cc | 3 ++ test/test-cases/regression/action-msg.json | 42 ++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/rule_with_actions.cc b/src/rule_with_actions.cc index f6642b67e6..4ab58a1bea 100644 --- a/src/rule_with_actions.cc +++ b/src/rule_with_actions.cc @@ -101,10 +101,13 @@ RuleWithActions::RuleWithActions( m_containsMultiMatchAction = true; delete a; } else if (auto sa = dynamic_cast(a)) { + delete m_severity; m_severity = sa; } else if (auto lda = dynamic_cast(a)) { // cppcheck-suppress unreadVariable ; false positive + delete m_logData; m_logData = lda; } else if (auto ma = dynamic_cast(a)) { // cppcheck-suppress unreadVariable ; false positive + delete m_msg; m_msg = ma; } else if (auto sva = dynamic_cast(a)) { m_actionsSetVar.push_back(sva); diff --git a/test/test-cases/regression/action-msg.json b/test/test-cases/regression/action-msg.json index 34e9fe5fed..d58b570333 100644 --- a/test/test-cases/regression/action-msg.json +++ b/test/test-cases/regression/action-msg.json @@ -118,5 +118,47 @@ "SecRule REQUEST_HEADERS \"@rx PHPSESSID\" \"id:1,capture,t:lowercase,t:none,msg:'This is a test: %{TX.0}% ops'\"", "SecRule TX \"@rx to_test\" \"id:2,t:lowercase,capture,t:none\"" ] + }, + { + "enabled": 1, + "version_min": 300000, + "version_max": 0, + "title": "Testing action :: msg - informed twice, last one wins", + "client": { + "ip": "200.249.12.31", + "port": 2313 + }, + "server": { + "ip": "200.249.12.31", + "port": 80 + }, + "request": { + "headers": { + "Cookie": "PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120", + "Content-Length": "0" + }, + "uri": "/test.pl?param1= test ¶m2=test2", + "method": "GET", + "http_version": 1.1, + "body": [ + "" + ] + }, + "response": { + "headers": { + "Content-Length": "0" + }, + "body": [ + "" + ] + }, + "expected": { + "debug_log": "Saving msg: the second message", + "http_code": 200 + }, + "rules": [ + "SecRuleEngine On", + "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,phase:2,pass,msg:'the first message',msg:'the second message'\"" + ] } ]