summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorColin Walters <walters@verbum.org>2021-06-10 11:33:18 -0400
committerGitHub <noreply@github.com>2021-06-10 11:33:18 -0400
commit7d4f22632325660a7403b1d71ae59401b29f6049 (patch)
treea8f2a2bbad87387f950eee9a12863f07015c4a1d
parentdc4c266cc578e93a04ae6f845d39480a8c9a49e2 (diff)
parenta00f39fc4e74266c168c4819e1d67eb9f08e4fb8 (diff)
downloadbubblewrap-7d4f22632325660a7403b1d71ae59401b29f6049.tar.gz
Merge pull request #409 from smcv/mount-onto-socket
Don't require mount point for a non-directory to be a regular file
-rwxr-xr-xtests/test-run.sh9
-rw-r--r--utils.c9
2 files changed, 15 insertions, 3 deletions
diff --git a/tests/test-run.sh b/tests/test-run.sh
index 4fb5e22..da7265f 100755
--- a/tests/test-run.sh
+++ b/tests/test-run.sh
@@ -80,7 +80,7 @@ if [ -z "${BWRAP_MUST_WORK-}" ] && ! $RUN true; then
skip Seems like bwrap is not working at all. Maybe setuid is not working
fi
-echo "1..50"
+echo "1..51"
# Test help
${BWRAP} --help > help.txt
@@ -398,4 +398,11 @@ command stat -c '%a' new-file-mountpoint > new-file-permissions
assert_file_has_content new-file-permissions 444
echo "ok - Files and directories created as mount points have expected permissions"
+if [ -S /dev/log ]; then
+ $RUN --bind / / --bind "$(realpath /dev/log)" "$(realpath /dev/log)" true
+ echo "ok - Can bind-mount a socket (/dev/log) onto a socket"
+else
+ echo "ok # SKIP - /dev/log is not a socket, cannot test bubblewrap#409"
+fi
+
echo "ok - End of test"
diff --git a/utils.c b/utils.c
index a99a865..ea15158 100644
--- a/utils.c
+++ b/utils.c
@@ -448,9 +448,14 @@ ensure_file (const char *path,
/* We check this ahead of time, otherwise
the create file will fail in the read-only
- case with EROFS instead of EEXIST */
+ case with EROFS instead of EEXIST.
+
+ We're trying to set up a mount point for a non-directory, so any
+ non-directory, non-symlink is acceptable - it doesn't necessarily
+ have to be a regular file. */
if (stat (path, &buf) == 0 &&
- S_ISREG (buf.st_mode))
+ !S_ISDIR (buf.st_mode) &&
+ !S_ISLNK (buf.st_mode))
return 0;
if (create_file (path, mode, NULL) != 0 && errno != EEXIST)