Skip to content

Commit 7e0bc26

Browse files
committed
Using performLogging function
1 parent a1547ea commit 7e0bc26

File tree

4 files changed

+76
-46
lines changed

4 files changed

+76
-46
lines changed

headers/modsecurity/rule_with_actions.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ class RuleWithActions : public Rule {
7979
int *nth) const;
8080

8181

82+
void performLogging(Transaction *trans,
83+
std::shared_ptr<RuleMessage> ruleMessage,
84+
bool lastLog = true,
85+
bool chainedParentNull = false);
86+
8287
std::vector<actions::Action *> getActionsByName(const std::string& name,
8388
Transaction *t);
8489
bool containsTag(const std::string& name, Transaction *t);
@@ -132,4 +137,4 @@ class RuleWithActions : public Rule {
132137
#endif
133138

134139

135-
#endif // HEADERS_MODSECURITY_RULE_WITH_ACTIONS_H_
140+
#endif // HEADERS_MODSECURITY_RULE_WITH_ACTIONS_H_

src/rule_unconditional.cc

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
*/
1515

1616
#include "modsecurity/rule_unconditional.h"
17-
#include "modsecurity/rule_message.h"
17+
1818

1919
namespace modsecurity {
2020

@@ -34,26 +34,7 @@ bool RuleUnconditional::evaluate(Transaction *trans,
3434

3535
executeActionsAfterFullMatch(trans, containsBlock, ruleMessage);
3636

37-
/* last rule in the chain. */
38-
bool isItToBeLogged = ruleMessage->m_saveMessage;
39-
if (isItToBeLogged && !hasMultimatch()
40-
&& !ruleMessage->m_message.empty()) {
41-
/* warn */
42-
trans->m_rulesMessages.push_back(*ruleMessage);
43-
44-
/* error */
45-
if (!ruleMessage->m_isDisruptive) {
46-
trans->serverLog(ruleMessage);
47-
}
48-
}
49-
else if (hasBlockAction() && !hasMultimatch()) {
50-
/* warn */
51-
trans->m_rulesMessages.push_back(*ruleMessage);
52-
/* error */
53-
if (!ruleMessage->m_isDisruptive) {
54-
trans->serverLog(ruleMessage);
55-
}
56-
}
37+
performLogging(trans, ruleMessage);
5738

5839
return true;
5940
}

src/rule_with_actions.cc

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,72 @@ std::vector<actions::Action *> RuleWithActions::getActionsByName(const std::stri
474474
return ret;
475475
}
476476

477+
void RuleWithActions::performLogging(Transaction *trans,
478+
std::shared_ptr<RuleMessage> ruleMessage,
479+
bool lastLog,
480+
bool chainedParentNull) {
481+
482+
/* last rule in the chain. */
483+
bool isItToBeLogged = ruleMessage->m_saveMessage;
484+
485+
/**
486+
*
487+
* RuleMessage is stacked allocated for the rule execution,
488+
* anything beyond this may lead to invalid pointer access.
489+
*
490+
* In case of a warning, o set of messages is saved to be read
491+
* at audit log generation. Therefore demands a copy here.
492+
*
493+
* FIXME: Study an way to avoid the copy.
494+
*
495+
**/
496+
if (lastLog) {
497+
if (chainedParentNull) {
498+
isItToBeLogged = (ruleMessage->m_saveMessage && (m_chainedRuleParent == nullptr));
499+
if (isItToBeLogged && !hasMultimatch()) {
500+
/* warn */
501+
trans->m_rulesMessages.push_back(*ruleMessage);
502+
503+
/* error */
504+
if (!ruleMessage->m_isDisruptive) {
505+
trans->serverLog(ruleMessage);
506+
}
507+
}
508+
} else if (hasBlockAction() && !hasMultimatch()) {
509+
/* warn */
510+
trans->m_rulesMessages.push_back(*ruleMessage);
511+
/* error */
512+
if (!ruleMessage->m_isDisruptive) {
513+
trans->serverLog(ruleMessage);
514+
}
515+
} else {
516+
if (isItToBeLogged && !hasMultimatch()
517+
&& !ruleMessage->m_message.empty()) {
518+
/* warn */
519+
trans->m_rulesMessages.push_back(*ruleMessage);
520+
521+
/* error */
522+
if (!ruleMessage->m_isDisruptive) {
523+
trans->serverLog(ruleMessage);
524+
}
525+
}
526+
}
527+
} else {
528+
if (hasMultimatch() && isItToBeLogged) {
529+
/* warn */
530+
trans->m_rulesMessages.push_back(*ruleMessage.get());
531+
532+
/* error */
533+
if (!ruleMessage->m_isDisruptive) {
534+
trans->serverLog(ruleMessage);
535+
}
536+
537+
RuleMessage *rm = new RuleMessage(this, trans);
538+
rm->m_saveMessage = ruleMessage->m_saveMessage;
539+
ruleMessage.reset(rm);
540+
}
541+
}
542+
}
477543

478544
std::string RuleWithActions::logData(Transaction *t) { return m_logData->data(t); }
479545
std::string RuleWithActions::msg(Transaction *t) { return m_msg->data(t); }

src/rule_with_operator.cc

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -325,20 +325,7 @@ bool RuleWithOperator::evaluate(Transaction *trans,
325325
executeActionsIndependentOfChainedRuleResult(trans,
326326
&containsBlock, ruleMessage);
327327

328-
bool isItToBeLogged = ruleMessage->m_saveMessage;
329-
if (hasMultimatch() && isItToBeLogged) {
330-
/* warn */
331-
trans->m_rulesMessages.push_back(*ruleMessage);
332-
333-
/* error */
334-
if (!ruleMessage->m_isDisruptive) {
335-
trans->serverLog(ruleMessage);
336-
}
337-
338-
RuleMessage *rm = new RuleMessage(this, trans);
339-
rm->m_saveMessage = ruleMessage->m_saveMessage;
340-
ruleMessage.reset(rm);
341-
}
328+
performLogging(trans, ruleMessage, false);
342329

343330
globalRet = true;
344331
}
@@ -382,16 +369,7 @@ bool RuleWithOperator::evaluate(Transaction *trans,
382369
executeActionsAfterFullMatch(trans, containsBlock, ruleMessage);
383370

384371
/* last rule in the chain. */
385-
bool isItToBeLogged = (ruleMessage->m_saveMessage && (m_chainedRuleParent == nullptr));
386-
if (isItToBeLogged && !hasMultimatch()) {
387-
/* warn */
388-
trans->m_rulesMessages.push_back(*ruleMessage);
389-
390-
/* error */
391-
if (!ruleMessage->m_isDisruptive) {
392-
trans->serverLog(ruleMessage);
393-
}
394-
}
372+
performLogging(trans, ruleMessage, true, true);
395373
return true;
396374
}
397375

0 commit comments

Comments
 (0)