summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-01-20 22:23:18 +0100
committerAndreas Kling <kling@serenityos.org>2020-01-20 22:23:18 +0100
commit17e5fc301be1d30cb18e2f0b22ada84485ecd1c3 (patch)
treeacb25903fce73c2828a0eaa7e418d43b44165b2a
parentcec0268ffab8a2e9d9b5b2ad742310d629f2fe60 (diff)
downloadserenity-17e5fc301be1d30cb18e2f0b22ada84485ecd1c3.zip
WindowServer: Use unveil()
WindowServer needs persistent access to a few things: - /res (for themes, fonts, cursors, apps, wallpapers, etc.) - /etc/passwd (for username lookup, not sure this is actually needed..) - /home/anon/WindowManager.ini (FIXME: this should not be hard-coded..) These things are unveiled temporarily, and then dropped: - /tmp (for setting up sockets) - /dev (for opening input and framebuffer devices) This leaves WindowServer running with a very limited view of the file system, how neat is that!
-rw-r--r--Servers/WindowServer/main.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/Servers/WindowServer/main.cpp b/Servers/WindowServer/main.cpp
index 34e95df599..48323e39ff 100644
--- a/Servers/WindowServer/main.cpp
+++ b/Servers/WindowServer/main.cpp
@@ -41,6 +41,34 @@ int main(int, char**)
return 1;
}
+ if (unveil("/res", "r") < 0) {
+ perror("unveil");
+ return 1;
+ }
+
+ if (unveil("/etc/passwd", "r") < 0) {
+ perror("unveil");
+ return 1;
+ }
+
+ if (unveil("/tmp", "cw") < 0) {
+ perror("unveil");
+ return 1;
+ }
+
+ // FIXME: WindowServer should obviously not hardcode this.
+ // Instead, we should have a ConfigServer or similar that allows programs
+ // to get/set user settings over IPC without giving them access to any files.
+ if (unveil("/home/anon/WindowManager.ini", "rwc") < 0) {
+ perror("unveil");
+ return 1;
+ }
+
+ if (unveil("/dev", "rw") < 0) {
+ perror("unveil");
+ return 1;
+ }
+
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_flags = SA_NOCLDWAIT;
@@ -72,6 +100,21 @@ int main(int, char**)
auto wm = WSWindowManager::construct(*palette);
auto mm = WSMenuManager::construct();
+ if (unveil("/tmp", "") < 0) {
+ perror("unveil");
+ return 1;
+ }
+
+ if (unveil("/dev", "") < 0) {
+ perror("unveil");
+ return 1;
+ }
+
+ if (unveil(nullptr, nullptr) < 0) {
+ perror("unveil");
+ return 1;
+ }
+
dbgprintf("Entering WindowServer main loop.\n");
loop.exec();
ASSERT_NOT_REACHED();