From 00fe8d7ce3d59213cd5f1622a83e10428823bddc Mon Sep 17 00:00:00 2001 From: Jan Beich Date: Thu, 25 Apr 2019 07:08:04 +0000 Subject: [PATCH] Cage: drop root on startup like Sway wlroots may need setuid to run on DRM if built without (e)logind support. --- cage.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/cage.c b/cage.c index d4cf210..cef25e4 100644 --- a/cage.c +++ b/cage.c @@ -65,6 +65,22 @@ spawn_primary_client(char *argv[], pid_t *pid_out) return true; } +static bool drop_permissions(void) +{ + if (getuid() != geteuid() || getgid() != getegid()) { + if (setuid(getuid()) != 0 || setgid(getgid()) != 0) { + wlr_log(WLR_ERROR, "Unable to drop root, refusing to start"); + return false; + } + } + if (setuid(0) != -1) { + wlr_log(WLR_ERROR, "Unable to drop root (we shouldn't be able to " + "restore it after setuid), refusing to start"); + return false; + } + return true; +} + static int handle_signal(int signal, void *data) { @@ -184,6 +200,11 @@ main(int argc, char *argv[]) goto end; } + if (!drop_permissions()) { + ret = 1; + goto end; + } + renderer = wlr_backend_get_renderer(server.backend); wlr_renderer_init_wl_display(renderer, server.wl_display);