Skip to content

Commit f47b57b

Browse files
happyCoder92copybara-github
authored andcommitted
PolicyBuilder: Error on trying to add non-existing
This is also a preparation for turning failed mounts into a fatal error PiperOrigin-RevId: 911222423 Change-Id: I536df88f8897986369d397751391ec9c83e75106
1 parent 8697eee commit f47b57b

2 files changed

Lines changed: 69 additions & 27 deletions

File tree

sandboxed_api/sandbox2/policybuilder.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1643,6 +1643,17 @@ PolicyBuilder& PolicyBuilder::AddFileAtIfNamespaced(absl::string_view outside,
16431643
return *this;
16441644
}
16451645

1646+
if (!IsFile(*valid_outside)) {
1647+
if (IsDirectory(*valid_outside)) {
1648+
SetError(absl::InvalidArgumentError(absl::StrCat(
1649+
"Cannot add ", outside, " as it is a directory not a file")));
1650+
} else {
1651+
SetError(absl::InvalidArgumentError(
1652+
absl::StrCat("Cannot add ", outside, " as it does not exist")));
1653+
}
1654+
return *this;
1655+
}
1656+
16461657
if (absl::StartsWith(*valid_outside, "/proc/self")) {
16471658
SetError(absl::InvalidArgumentError(
16481659
absl::StrCat("Cannot add /proc/self mounts, you need to mount the "
@@ -1723,6 +1734,17 @@ PolicyBuilder& PolicyBuilder::AddDirectoryAtIfNamespaced(
17231734
return *this;
17241735
}
17251736

1737+
if (!IsDirectory(*valid_outside)) {
1738+
if (IsFile(*valid_outside)) {
1739+
SetError(absl::InvalidArgumentError(absl::StrCat(
1740+
"Cannot add ", outside, " as it is a file not a directory")));
1741+
} else {
1742+
SetError(absl::InvalidArgumentError(
1743+
absl::StrCat("Cannot add ", outside, " as it does not exist")));
1744+
}
1745+
return *this;
1746+
}
1747+
17261748
if (absl::StartsWith(*valid_outside, "/proc/self")) {
17271749
SetError(absl::InvalidArgumentError(
17281750
absl::StrCat("Cannot add /proc/self mounts, you need to mount the "

sandboxed_api/sandbox2/policybuilder_test.cc

Lines changed: 47 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -138,30 +138,34 @@ TEST(PolicyBuilderTest, WrongTypeIgnored) {
138138
}
139139

140140
TEST(PolicyBuilderTest, ApisWithPathValidation) {
141-
const std::initializer_list<std::pair<absl::string_view, absl::StatusCode>>
142-
kTestCases = {
143-
{"/a", absl::StatusCode::kOk},
144-
{"/a/b/c/d", absl::StatusCode::kOk},
145-
{"/a/b/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", absl::StatusCode::kOk},
146-
{"", absl::StatusCode::kInvalidArgument},
147-
// Fails because we reject paths starting with '..'
148-
{"..", absl::StatusCode::kInvalidArgument},
149-
{"..a", absl::StatusCode::kInvalidArgument},
150-
{"../a", absl::StatusCode::kInvalidArgument},
151-
// Fails because is not absolute
152-
{"a", absl::StatusCode::kInvalidArgument},
153-
{"a/b", absl::StatusCode::kInvalidArgument},
154-
{"a/b/c", absl::StatusCode::kInvalidArgument},
155-
// Fails because '..' in path
156-
{"/a/b/c/../d", absl::StatusCode::kInvalidArgument},
157-
// Fails because '.' in path
158-
{"/a/b/c/./d", absl::StatusCode::kInvalidArgument},
159-
// Fails because '//' in path
160-
{"/a/b/c//d", absl::StatusCode::kInvalidArgument},
161-
// Fails because path ends with '/'
162-
{"/a/b/c/d/", absl::StatusCode::kInvalidArgument},
163-
};
164-
for (auto const& [path, status] : kTestCases) {
141+
// Fails because /usr is a directory, not a file.
142+
EXPECT_THAT(PolicyBuilder().AddFile("/usr").TryBuild(),
143+
StatusIs(absl::StatusCode::kInvalidArgument));
144+
EXPECT_THAT(PolicyBuilder().AddFileAt("/usr", "/input").TryBuild(),
145+
StatusIs(absl::StatusCode::kInvalidArgument));
146+
// Fails because /usr/bin/find is a file, not a directory.
147+
EXPECT_THAT(PolicyBuilder().AddDirectory("/usr/bin/find").TryBuild(),
148+
StatusIs(absl::StatusCode::kInvalidArgument));
149+
EXPECT_THAT(
150+
PolicyBuilder().AddDirectoryAt("/usr/bin/find", "/input").TryBuild(),
151+
StatusIs(absl::StatusCode::kInvalidArgument));
152+
const std::initializer_list<absl::string_view> kInvalidPathTestCases = {
153+
"",
154+
// Fails because we reject paths starting with '..'
155+
"..", "..a", "../a",
156+
// Fails because is not absolute
157+
"a", "a/b", "a/b/c",
158+
// Fails because '..' in path
159+
"/a/b/c/../d",
160+
// Fails because '.' in path
161+
"/a/b/c/./d",
162+
// Fails because '//' in path
163+
"/a/b/c//d",
164+
// Fails because path ends with '/'
165+
"/a/b/c/d/",
166+
};
167+
for (absl::string_view path : kInvalidPathTestCases) {
168+
absl::StatusCode status = absl::StatusCode::kInvalidArgument;
165169
EXPECT_THAT(PolicyBuilder().AddFile(path).TryBuild(), StatusIs(status));
166170
EXPECT_THAT(PolicyBuilder().AddFileAt(path, "/input").TryBuild(),
167171
StatusIs(status));
@@ -171,16 +175,32 @@ TEST(PolicyBuilderTest, ApisWithPathValidation) {
171175
StatusIs(status));
172176
}
173177

178+
// Succeeds because it attempts to mount a file
179+
EXPECT_THAT(PolicyBuilder().AddFile("/usr/bin/find").TryBuild(), IsOk());
180+
EXPECT_THAT(PolicyBuilder().AddFileAt("/usr/bin/find", "/input").TryBuild(),
181+
IsOk());
182+
174183
// Fails because it attempts to mount to '/' inside
175184
EXPECT_THAT(PolicyBuilder().AddFile("/").TryBuild(),
176-
StatusIs(absl::StatusCode::kInternal));
185+
StatusIs(absl::StatusCode::kInvalidArgument));
177186
EXPECT_THAT(PolicyBuilder().AddDirectory("/").TryBuild(),
178187
StatusIs(absl::StatusCode::kInternal));
179188

180189
// Succeeds because it attempts to mount to '/' inside
181-
EXPECT_THAT(PolicyBuilder().AddFileAt("/a", "/input").TryBuild(), IsOk());
182-
EXPECT_THAT(PolicyBuilder().AddDirectoryAt("/a", "/input").TryBuild(),
190+
EXPECT_THAT(PolicyBuilder().AddDirectoryAt("/usr", "/input").TryBuild(),
191+
IsOk());
192+
}
193+
194+
TEST(PolicyBuilderTest, AddIfExists) {
195+
EXPECT_THAT(PolicyBuilder().AddFile("/nonexistent_file").TryBuild(),
196+
StatusIs(absl::StatusCode::kInvalidArgument));
197+
EXPECT_THAT(PolicyBuilder().AddFileIfExists("/nonexistent_file").TryBuild(),
183198
IsOk());
199+
EXPECT_THAT(PolicyBuilder().AddDirectory("/nonexistent_dir").TryBuild(),
200+
StatusIs(absl::StatusCode::kInvalidArgument));
201+
EXPECT_THAT(
202+
PolicyBuilder().AddDirectoryIfExists("/nonexistent_dir").TryBuild(),
203+
IsOk());
184204
}
185205

186206
TEST(PolicyBuilderTest, TestAnchorPathAbsolute) {

0 commit comments

Comments
 (0)