From: Nils Carlson Date: Thu, 31 Mar 2011 08:25:11 +0000 (+0200) Subject: Make root able to connect to any traceable app X-Git-Tag: v0.13~38 X-Git-Url: https://git.lttng.org/?p=ust.git;a=commitdiff_plain;h=f446d1cbf3f3b2e722b68b6bcbee2359d0f3d8e5 Make root able to connect to any traceable app Make root able to connect to any traceable app, checking (geteuid == 0). Signed-off-by: Nils Carlson --- diff --git a/libustcomm/ustcomm.c b/libustcomm/ustcomm.c index e401c42..dcf8cd8 100644 --- a/libustcomm/ustcomm.c +++ b/libustcomm/ustcomm.c @@ -18,6 +18,7 @@ /* API used by UST components to communicate with each other via sockets. */ #define _GNU_SOURCE +#include #include #include #include @@ -556,7 +557,7 @@ char *ustcomm_user_sock_dir(void) * -1: error */ -int ustcomm_connect_app(pid_t pid, int *app_fd) +static int connect_app_non_root(pid_t pid, int *app_fd) { int result; int retval = 0; @@ -588,6 +589,57 @@ free_dir_name: return retval; } + + +static int connect_app_root(pid_t pid, int *app_fd) +{ + DIR *tmp_dir; + struct dirent *dirent; + char *sock_name; + int result; + + tmp_dir = opendir(USER_TMP_DIR); + if (!tmp_dir) { + return -1; + } + + while ((dirent = readdir(tmp_dir))) { + if (!strncmp(dirent->d_name, USER_SOCK_DIR_BASE, + strlen(USER_SOCK_DIR_BASE))) { + + if (asprintf(&sock_name, USER_TMP_DIR "/%s/%u", + dirent->d_name, pid) < 0) { + goto close_tmp_dir; + } + + result = ustcomm_connect_path(sock_name, app_fd); + + free(sock_name); + + if (result == 0) { + goto close_tmp_dir; + } + } + } + +close_tmp_dir: + closedir(tmp_dir); + + return result; +} + +int ustcomm_connect_app(pid_t pid, int *app_fd) +{ + *app_fd = 0; + + if (geteuid()) { + return connect_app_non_root(pid, app_fd); + } else { + return connect_app_root(pid, app_fd); + } + +} + int ensure_dir_exists(const char *dir, mode_t mode) { struct stat st;