Upstream commit: https://github.com/WebKit/WebKit/commit/6a87eb254ef57a986a1a6ce9a3a4b66928afeb65 diff --git a/Source/WebKit/UIProcess/Launcher/glib/BubblewrapLauncher.cpp b/Source/WebKit/UIProcess/Launcher/glib/BubblewrapLauncher.cpp index ecc804663784..a2a1c9d7a4dd 100644 --- a/Source/WebKit/UIProcess/Launcher/glib/BubblewrapLauncher.cpp +++ b/Source/WebKit/UIProcess/Launcher/glib/BubblewrapLauncher.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -165,6 +164,15 @@ enum class BindFlags { Device, }; +static void bindSymlinksRealPath(Vector& args, const char* path, const char* bindOption = "--ro-bind") +{ + WTF::String realPath = FileSystem::realPath(path); + if (path != realPath) { + CString rpath = realPath.utf8(); + args.appendVector(Vector({ bindOption, rpath.data(), rpath.data() })); + } +} + static void bindIfExists(Vector& args, const char* path, BindFlags bindFlags = BindFlags::ReadOnly) { if (!path || path[0] == '\0') @@ -177,7 +185,16 @@ static void bindIfExists(Vector& args, const char* path, BindFlags bind bindType = "--ro-bind-try"; else bindType = "--bind-try"; - args.appendVector(Vector({ bindType, path, path })); + + // Canonicalize the source path, otherwise a symbolic link could + // point to a location outside of the namespace. + bindSymlinksRealPath(args, path, bindType); + + // As /etc is exposed wholesale, do not layer extraneous bind + // directives on top, which could fail in the presence of symbolic + // links. + if (!g_str_has_prefix(path, "/etc/")) + args.appendVector(Vector({ bindType, path, path })); } static void bindDBusSession(Vector& args, bool allowPortals) @@ -410,17 +427,6 @@ static void bindV4l(Vector& args) })); } -static void bindSymlinksRealPath(Vector& args, const char* path) -{ - char realPath[PATH_MAX]; - - if (realpath(path, realPath) && strcmp(path, realPath)) { - args.appendVector(Vector({ - "--ro-bind", realPath, realPath, - })); - } -} - // Translate a libseccomp error code into an error message. libseccomp // mostly returns negative errno values such as -ENOMEM, but some // standard errno values are used for non-standard purposes where their