Skip to content

Commit 3163c15

Browse files
committed
fix: enhance file existence checks to include regular file validation in FileRuleEvaluator
1 parent 5f6a9d0 commit 3163c15

File tree

2 files changed

+23
-6
lines changed

2 files changed

+23
-6
lines changed

src/modules/sca/src/sca_policy_check.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ RuleResult FileRuleEvaluator::Evaluate()
4242

4343
RuleResult FileRuleEvaluator::CheckFileForContents()
4444
{
45-
if (!m_fileSystemWrapper->exists(m_ctx.rule))
45+
if (!m_fileSystemWrapper->exists(m_ctx.rule) || !m_fileSystemWrapper->is_regular_file(m_ctx.rule))
4646
{
47-
return m_ctx.isNegated ? RuleResult::Found : RuleResult::NotFound;
47+
return RuleResult::Invalid;
4848
}
4949

5050
const auto pattern = *m_ctx.pattern; // NOLINT(bugprone-unchecked-optional-access)
@@ -77,8 +77,8 @@ RuleResult FileRuleEvaluator::CheckFileForContents()
7777

7878
RuleResult FileRuleEvaluator::CheckFileExistence()
7979
{
80-
const bool exists = m_fileSystemWrapper->exists(m_ctx.rule);
81-
const RuleResult result = exists ? RuleResult::Found : RuleResult::NotFound;
80+
const auto exists = m_fileSystemWrapper->exists(m_ctx.rule) && m_fileSystemWrapper->is_regular_file(m_ctx.rule);
81+
const auto result = exists ? RuleResult::Found : RuleResult::NotFound;
8282

8383
return m_ctx.isNegated ? (result == RuleResult::Found ? RuleResult::NotFound : RuleResult::Found) : result;
8484
}

src/modules/sca/tests/file_rule_evaluator_test.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ TEST_F(FileRuleEvaluatorTest, FileExistsReturnsFound)
4949
m_ctx.rule = "some/file";
5050

5151
EXPECT_CALL(*m_rawFsMock, exists(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
52+
EXPECT_CALL(*m_rawFsMock, is_regular_file(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
5253

5354
auto evaluator = CreateEvaluator();
5455
EXPECT_EQ(evaluator.Evaluate(), RuleResult::Found);
@@ -60,6 +61,7 @@ TEST_F(FileRuleEvaluatorTest, PatternRegexMatchesContentReturnsFound)
6061
m_ctx.rule = "some/file";
6162

6263
EXPECT_CALL(*m_rawFsMock, exists(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
64+
EXPECT_CALL(*m_rawFsMock, is_regular_file(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
6365
EXPECT_CALL(*m_rawIoMock, getFileContent("some/file")).WillOnce(::testing::Return("foo"));
6466

6567
auto evaluator = CreateEvaluator();
@@ -72,6 +74,7 @@ TEST_F(FileRuleEvaluatorTest, PatternRegexDoesNotMatchContentReturnsNotFound)
7274
m_ctx.rule = "some/file";
7375

7476
EXPECT_CALL(*m_rawFsMock, exists(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
77+
EXPECT_CALL(*m_rawFsMock, is_regular_file(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
7578
EXPECT_CALL(*m_rawIoMock, getFileContent("some/file")).WillOnce(::testing::Return("bar"));
7679

7780
auto evaluator = CreateEvaluator();
@@ -84,6 +87,7 @@ TEST_F(FileRuleEvaluatorTest, PatternExactLineMatchesReturnsFound)
8487
m_ctx.rule = "some/file";
8588

8689
EXPECT_CALL(*m_rawFsMock, exists(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
90+
EXPECT_CALL(*m_rawFsMock, is_regular_file(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
8791
EXPECT_CALL(*m_rawIoMock, readLineByLine(std::filesystem::path("some/file"), ::testing::_))
8892
.WillOnce(::testing::Invoke(
8993
[](const std::filesystem::path&, const std::function<bool(const std::string&)>& callback)
@@ -102,6 +106,7 @@ TEST_F(FileRuleEvaluatorTest, PatternExactLineNoMatchReturnsNotFound)
102106
m_ctx.rule = "some/file";
103107

104108
EXPECT_CALL(*m_rawFsMock, exists(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
109+
EXPECT_CALL(*m_rawFsMock, is_regular_file(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
105110
EXPECT_CALL(*m_rawIoMock, readLineByLine(std::filesystem::path("some/file"), ::testing::_))
106111
.WillOnce(::testing::Invoke(
107112
[](const std::filesystem::path&, const std::function<bool(const std::string&)>& callback)
@@ -114,13 +119,25 @@ TEST_F(FileRuleEvaluatorTest, PatternExactLineNoMatchReturnsNotFound)
114119
EXPECT_EQ(evaluator.Evaluate(), RuleResult::NotFound);
115120
}
116121

117-
TEST_F(FileRuleEvaluatorTest, PatternGivenButFileDoesNotExistReturnsNotFound)
122+
TEST_F(FileRuleEvaluatorTest, PatternGivenButFileDoesNotExistReturnsInvalid)
118123
{
119124
m_ctx.pattern = std::string("r:foo");
120125
m_ctx.rule = "some/file";
121126

122127
EXPECT_CALL(*m_rawFsMock, exists(std::filesystem::path("some/file"))).WillOnce(::testing::Return(false));
123128

124129
auto evaluator = CreateEvaluator();
125-
EXPECT_EQ(evaluator.Evaluate(), RuleResult::NotFound);
130+
EXPECT_EQ(evaluator.Evaluate(), RuleResult::Invalid);
131+
}
132+
133+
TEST_F(FileRuleEvaluatorTest, PatternGivenButPathIsNotRegularFileReturnsInvalid)
134+
{
135+
m_ctx.pattern = std::string("r:foo");
136+
m_ctx.rule = "some/file";
137+
138+
EXPECT_CALL(*m_rawFsMock, exists(std::filesystem::path("some/file"))).WillOnce(::testing::Return(true));
139+
EXPECT_CALL(*m_rawFsMock, is_regular_file(std::filesystem::path("some/file"))).WillOnce(::testing::Return(false));
140+
141+
auto evaluator = CreateEvaluator();
142+
EXPECT_EQ(evaluator.Evaluate(), RuleResult::Invalid);
126143
}

0 commit comments

Comments
 (0)