From mboxrd@z Thu Jan 1 00:00:00 1970 From: nils.carlson@ericsson.com (Nils Carlson) Date: Fri, 1 Apr 2011 09:17:00 +0200 Subject: [ltt-dev] [UST PATCH 5/6] Make root see all available pids In-Reply-To: <1301643140-6880-5-git-send-email-nils.carlson@ericsson.com> References: <1301643140-6880-1-git-send-email-nils.carlson@ericsson.com> <1301643140-6880-5-git-send-email-nils.carlson@ericsson.com> Message-ID: <4D957BEC.7070403@ericsson.com> merged with v2 appended to patch name. On 04/01/2011 09:32 AM, Nils Carlson wrote: > Changes since v1: > * Fix a whitespace > * Make functions that should be static static > > Allow root (geteuid() == 0) to see all pids. This way the super-user > can connect to any program. A step on the way of carefully outlining > what UST does and doesn't. > > Signed-off-by: Nils Carlson > --- > libustcomm/ustcomm.h | 4 ++- > libustctl/libustctl.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 63 insertions(+), 2 deletions(-) > > diff --git a/libustcomm/ustcomm.h b/libustcomm/ustcomm.h > index d16aec7..9952958 100644 > --- a/libustcomm/ustcomm.h > +++ b/libustcomm/ustcomm.h > @@ -25,7 +25,9 @@ > #include > > #define SOCK_DIR "/tmp/ust-app-socks" > -#define USER_SOCK_DIR "/tmp/ust-socks-" > +#define USER_TMP_DIR "/tmp" > +#define USER_SOCK_DIR_BASE "ust-socks-" > +#define USER_SOCK_DIR USER_TMP_DIR "/" USER_SOCK_DIR_BASE > > struct ustcomm_sock { > struct cds_list_head list; > diff --git a/libustctl/libustctl.c b/libustctl/libustctl.c > index 5625f43..356d5ef 100644 > --- a/libustctl/libustctl.c > +++ b/libustctl/libustctl.c > @@ -121,7 +121,7 @@ static void get_pids_in_dir(DIR *dir, pid_t **pid_list, > (*pid_list)[*pid_list_size - 1] = 0; /* Array end */ > } > > -pid_t *ustctl_get_online_pids(void) > +static pid_t *get_pids_non_root(void) > { > char *dir_name; > DIR *dir; > @@ -139,6 +139,9 @@ pid_t *ustctl_get_online_pids(void) > } > > pid_list = malloc(pid_list_size * sizeof(pid_t)); > + if (!pid_list) { > + goto close_dir; > + } > > get_pids_in_dir(dir,&pid_list,&pid_list_size); > > @@ -158,6 +161,62 @@ free_dir_name: > return pid_list; > } > > +static pid_t *get_pids_root(void) > +{ > + char *dir_name; > + DIR *tmp_dir, *dir; > + unsigned int pid_list_size = 1; > + pid_t *pid_list = NULL; > + struct dirent *dirent; > + > + tmp_dir = opendir(USER_TMP_DIR); > + if (!tmp_dir) { > + return NULL; > + } > + > + pid_list = malloc(pid_list_size * sizeof(pid_t)); > + if (!pid_list) { > + goto close_tmp_dir; > + } > + > + while ((dirent = readdir(tmp_dir))) { > + /* Compare the dir to check for the USER_SOCK_DIR_BASE prefix */ > + if (!strncmp(dirent->d_name, USER_SOCK_DIR_BASE, > + strlen(USER_SOCK_DIR_BASE))) { > + > + if (asprintf(&dir_name, USER_TMP_DIR "/%s", dirent->d_name)< 0) { > + goto close_tmp_dir; > + } > + > + dir = opendir(dir_name); > + > + free(dir_name); > + > + if (!dir) { > + continue; > + } > + > + get_pids_in_dir(dir,&pid_list,&pid_list_size); > + > + closedir(dir); > + } > + } > + > +close_tmp_dir: > + closedir(tmp_dir); > + > + return pid_list; > +} > + > +pid_t *ustctl_get_online_pids(void) > +{ > + if (geteuid()) { > + return get_pids_non_root(); > + } else { > + return get_pids_root(); > + } > +} > + > /** > * Sets marker state (USTCTL_MS_ON or USTCTL_MS_OFF). > *