From f0e38634ef5ce31b9a017614243868b7aa206321 Mon Sep 17 00:00:00 2001 From: thomasfsteeples Date: Fri, 16 Sep 2022 22:46:11 +0100 Subject: [PATCH] Allowed arbitrary length uids when setting XDG_RUNTIME_DIR --- src/login.c | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/login.c b/src/login.c index 7788d49..c42f27a 100644 --- a/src/login.c +++ b/src/login.c @@ -257,16 +257,32 @@ void env_xdg_session(const enum display_server display_server) } } +static unsigned int ilog10(unsigned int n) { + unsigned int res = 0; + while (n >= 10) { + ++res; + n /= 10; + } + return res; +} + void env_xdg(const char* tty_id, const char* desktop_name) { - char user[15]; - snprintf(user, 15, "/run/user/%d", getuid()); - setenv("XDG_RUNTIME_DIR", user, 0); - setenv("XDG_SESSION_CLASS", "user", 0); - setenv("XDG_SESSION_ID", "1", 0); - setenv("XDG_SESSION_DESKTOP", desktop_name, 0); - setenv("XDG_SEAT", "seat0", 0); - setenv("XDG_VTNR", tty_id, 0); + uid_t user_uid = getuid(); + char* xdg_runtime_dir_prefix = "/run/user/"; + // ilog10(n) + 1 == number of digits in n + unsigned int xdg_runtime_dir_length = strlen(xdg_runtime_dir_prefix) + ilog10(user_uid) + 1; + char* user = malloc(sizeof(*user) * (xdg_runtime_dir_length + 1)); + snprintf(user, xdg_runtime_dir_length + 1, "%s%d", xdg_runtime_dir_prefix, user_uid); + setenv("XDG_RUNTIME_DIR", user, 0); + free(user); + user = NULL; + + setenv("XDG_SESSION_CLASS", "user", 0); + setenv("XDG_SESSION_ID", "1", 0); + setenv("XDG_SESSION_DESKTOP", desktop_name, 0); + setenv("XDG_SEAT", "seat0", 0); + setenv("XDG_VTNR", tty_id, 0); } void add_utmp_entry(