void Rule::setMask()
{
- std::fill_n(ruleData()->mask, AUDIT_BITMASK_SIZE, ~0);
+ std::fill_n(ruleData()->mask, AUDIT_BITMASK_SIZE/2, ~0);
}
void Rule::setMask(unsigned int syscall)
void Rule::unsetMask()
{
- std::fill_n(ruleData()->mask, AUDIT_BITMASK_SIZE, 0);
+ std::fill_n(ruleData()->mask, AUDIT_BITMASK_SIZE/2, 0);
}
void Rule::unsetMask(unsigned int syscall)
* See the License for the specific language governing permissions and
* limitations under the License
*/
-
+#include <asm/unistd.h>
#include "rule-apply-engine.h"
+namespace {
+const unsigned int alwaysSyscalls[] = {
+//TBD : to be added always syscall
+};
+}
+
RuleApplyEngine::RuleApplyEngine()
{
+ addNeverRules();
}
RuleApplyEngine::~RuleApplyEngine()
removeAll(audit);
optimize(rule);
+ applyNeverRules();
addAll(audit);
}
removeAll(audit);
optimizedList.clear();
+ addNeverRules();
for (auto r : adminList) {
optimize(r);
}
- addAll(audit);
+
+ if (optimizedList.size() > 1) {
+ applyNeverRules();
+ addAll(audit);
+ }
}
RuleApplyEngine::RuleList RuleApplyEngine::getRules() const
{
rule.unsetCondition(FieldType::Tag);
- for (auto r = optimizedList.begin(); r != optimizedList.end(); r++) {
+ for (auto r = optimizedList.begin()+1; r != optimizedList.end(); r++) {
if (*r == rule)
return;
if (!rule.getMask().empty())
optimizedList.emplace_back(rule);
}
+
+void RuleApplyEngine::addNeverRules()
+{
+ if (optimizedList.empty()) {
+ Rule syscallNeverRule(Action::Never);
+ optimizedList.emplace_front(syscallNeverRule);
+ }
+}
+
+void RuleApplyEngine::applyNeverRules()
+{
+ optimizedList[0].setMask();
+ for (auto syscall : alwaysSyscalls) {
+ optimizedList[0].unsetMask(syscall);
+ }
+ for (auto r = optimizedList.begin()+1; r != optimizedList.end(); r++) {
+ optimizedList[0].unsetMask(r->getMask());
+ }
+}