Skip to content

Commit 7ea97bd

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: 889938629 Change-Id: I006d1ff0baa24828c2b36e9eddb93b2fb1534208
1 parent e38eb67 commit 7ea97bd

File tree

2 files changed

+69
-27
lines changed

2 files changed

+69
-27
lines changed

sandboxed_api/sandbox2/policybuilder.cc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1633,6 +1633,17 @@ PolicyBuilder& PolicyBuilder::AddFileAtIfNamespaced(absl::string_view outside,
16331633
return *this;
16341634
}
16351635

1636+
if (!IsFile(*valid_outside)) {
1637+
if (IsDirectory(*valid_outside)) {
1638+
SetError(absl::InvalidArgumentError(absl::StrCat(
1639+
"Cannot add ", outside, " as it is a directory not a file")));
1640+
} else {
1641+
SetError(absl::InvalidArgumentError(
1642+
absl::StrCat("Cannot add ", outside, " as it does not exist")));
1643+
}
1644+
return *this;
1645+
}
1646+
16361647
if (absl::StartsWith(*valid_outside, "/proc/self") &&
16371648
*valid_outside != "/proc/self/cpuset") {
16381649
SetError(absl::InvalidArgumentError(
@@ -1714,6 +1725,17 @@ PolicyBuilder& PolicyBuilder::AddDirectoryAtIfNamespaced(
17141725
return *this;
17151726
}
17161727

1728+
if (!IsDirectory(*valid_outside)) {
1729+
if (IsFile(*valid_outside)) {
1730+
SetError(absl::InvalidArgumentError(absl::StrCat(
1731+
"Cannot add ", outside, " as it is a file not a directory")));
1732+
} else {
1733+
SetError(absl::InvalidArgumentError(
1734+
absl::StrCat("Cannot add ", outside, " as it does not exist")));
1735+
}
1736+
return *this;
1737+
}
1738+
17171739
if (absl::StartsWith(*valid_outside, "/proc/self")) {
17181740
SetError(absl::InvalidArgumentError(
17191741
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)