From dbd75de7b2c05c98d6171bc531a1ecb23fb7e80d Mon Sep 17 00:00:00 2001 From: Nils Carlson Date: Tue, 29 Mar 2011 10:27:46 +0200 Subject: [PATCH] Make app socket directories per-user v2 Changes since v1: * Document memory allocation Make a separate app socket directories for each user, providing some basic security and also the possibility of consistent cleanup. Signed-off-by: Nils Carlson --- libust/tracectl.c | 34 +++++++++++++++++++--------------- libustcomm/ustcomm.c | 34 +++++++++++++++++++++++++++++----- libustcomm/ustcomm.h | 4 ++++ 3 files changed, 52 insertions(+), 20 deletions(-) diff --git a/libust/tracectl.c b/libust/tracectl.c index 33c7280..ae92b7e 100644 --- a/libust/tracectl.c +++ b/libust/tracectl.c @@ -1221,37 +1221,41 @@ static void auto_probe_connect(struct marker *m) static struct ustcomm_sock * init_app_socket(int epoll_fd) { - char *name; + char *dir_name, *sock_name; int result; - struct ustcomm_sock *sock; + struct ustcomm_sock *sock = NULL; - result = asprintf(&name, "%s/%d", SOCK_DIR, (int)getpid()); + dir_name = ustcomm_user_sock_dir(); + if (!dir_name) + return NULL; + + result = asprintf(&sock_name, "%s/%d", dir_name, (int)getpid()); if (result < 0) { ERR("string overflow allocating socket name, " "UST thread bailing"); - return NULL; + goto free_dir_name; } - result = ensure_dir_exists(SOCK_DIR); + result = ensure_dir_exists(dir_name); if (result == -1) { ERR("Unable to create socket directory %s, UST thread bailing", - SOCK_DIR); - goto free_name; + dir_name); + goto free_sock_name; } - sock = ustcomm_init_named_socket(name, epoll_fd); + sock = ustcomm_init_named_socket(sock_name, epoll_fd); if (!sock) { ERR("Error initializing named socket (%s). Check that directory" - "exists and that it is writable. UST thread bailing", name); - goto free_name; + "exists and that it is writable. UST thread bailing", sock_name); + goto free_sock_name; } - free(name); - return sock; +free_sock_name: + free(sock_name); +free_dir_name: + free(dir_name); -free_name: - free(name); - return NULL; + return sock; } static void __attribute__((constructor)) init() diff --git a/libustcomm/ustcomm.c b/libustcomm/ustcomm.c index 43f4289..dce1e52 100644 --- a/libustcomm/ustcomm.c +++ b/libustcomm/ustcomm.c @@ -533,6 +533,21 @@ close_sock: return -1; } +/* Returns the current users socket directory, must be freed */ +char *ustcomm_user_sock_dir(void) +{ + int result; + char *sock_dir = NULL; + + result = asprintf(&sock_dir, "%s%s", USER_SOCK_DIR, + cuserid(NULL)); + if (result < 0) { + ERR("string overflow allocating directory name"); + return NULL; + } + + return sock_dir; +} /* Open a connection to a traceable app. * @@ -545,21 +560,30 @@ int ustcomm_connect_app(pid_t pid, int *app_fd) { int result; int retval = 0; - char *name; + char *dir_name, *sock_name; + + dir_name = ustcomm_user_sock_dir(); + if (!dir_name) + return -ENOMEM; - result = asprintf(&name, "%s/%d", SOCK_DIR, pid); + result = asprintf(&sock_name, "%s/%d", dir_name, pid); if (result < 0) { ERR("failed to allocate socket name"); - return -1; + retval = -1; + goto free_dir_name; } - result = ustcomm_connect_path(name, app_fd); + result = ustcomm_connect_path(sock_name, app_fd); if (result < 0) { ERR("failed to connect to app"); retval = -1; + goto free_sock_name; } - free(name); +free_sock_name: + free(sock_name); +free_dir_name: + free(dir_name); return retval; } diff --git a/libustcomm/ustcomm.h b/libustcomm/ustcomm.h index 0ec04fc..db38119 100644 --- a/libustcomm/ustcomm.h +++ b/libustcomm/ustcomm.h @@ -25,6 +25,7 @@ #include #define SOCK_DIR "/tmp/ust-app-socks" +#define USER_SOCK_DIR "/tmp/ust-socks-" struct ustcomm_sock { struct cds_list_head list; @@ -156,6 +157,9 @@ extern int ustcomm_req(int sock, char *res_data); extern int ustcomm_request_consumer(pid_t pid, const char *channel); + +/* Returns the current users socket directory, must be freed */ +extern char *ustcomm_user_sock_dir(void); extern int ustcomm_connect_app(pid_t pid, int *app_fd); extern int ustcomm_connect_path(const char *path, int *connection_fd); -- 2.34.1