From mboxrd@z Thu Jan 1 00:00:00 1970 From: nils.carlson@ericsson.com (Nils Carlson) Date: Fri, 1 Apr 2011 09:14:55 +0200 Subject: [ltt-dev] [UST PATCH 1/6] Make app socket directories per-user v2 In-Reply-To: <1301643140-6880-1-git-send-email-nils.carlson@ericsson.com> References: <1301643140-6880-1-git-send-email-nils.carlson@ericsson.com> Message-ID: <4D957B6F.7090306@ericsson.com> merged. On 04/01/2011 09:32 AM, Nils Carlson wrote: > 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); >