X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=liblttngctl%2Flttngctl.c;h=b64ace2e6d80de0ce085791f698604e53f8eb523;hp=51f5f6572e1a87da43400a439701efef1ca1d333;hb=35346445460dfe7ba5bbcfdbe279c07c1ee3219b;hpb=d980092014bba68425b9c63a020bfbc034dc9ad1 diff --git a/liblttngctl/lttngctl.c b/liblttngctl/lttngctl.c index 51f5f6572..b64ace2e6 100644 --- a/liblttngctl/lttngctl.c +++ b/liblttngctl/lttngctl.c @@ -21,18 +21,17 @@ */ #define _GNU_SOURCE -#include #include +#include #include #include #include #include -#include - #include -#include "lttngerr.h" -#include "lttng-share.h" +#include +#include +#include /* Socket to session daemon for communication */ static int sessiond_socket; @@ -125,7 +124,7 @@ end: /* * Check if the specified group name exist. * - * If yes return 0, else return -1. + * If yes return 1, else return -1. */ static int check_tracing_group(const char *grp_name) { @@ -161,7 +160,7 @@ static int check_tracing_group(const char *grp_name) for (i = 0; i < grp_list_size; i++) { if (grp_list[i] == grp_tracing->gr_gid) { - ret = 0; + ret = 1; break; } } @@ -174,25 +173,79 @@ end: } /* - * Set sessiond socket path by putting it in the global sessiond_sock_path - * variable. + * Try connect to session daemon with sock_path. + * + * Return 0 on success, else -1 + */ +static int try_connect_sessiond(const char *sock_path) +{ + int ret; + + /* If socket exist, we check if the daemon listens for connect. */ + ret = access(sock_path, F_OK); + if (ret < 0) { + /* Not alive */ + return -1; + } + + ret = lttcomm_connect_unix_sock(sock_path); + if (ret < 0) { + /* Not alive */ + return -1; + } + + ret = lttcomm_close_unix_sock(ret); + if (ret < 0) { + perror("lttcomm_close_unix_sock"); + } + + return 0; +} + +/* + * Set sessiond socket path by putting it in the global sessiond_sock_path + * variable. */ static int set_session_daemon_path(void) { int ret; + int in_tgroup = 0; /* In tracing group */ + uid_t uid; + + uid = getuid(); - /* Are we in the tracing group ? */ - ret = check_tracing_group(tracing_group); - if (ret < 0 && getuid() != 0) { + if (uid != 0) { + /* Are we in the tracing group ? */ + in_tgroup = check_tracing_group(tracing_group); + } + + if (uid == 0) { + /* Root */ + copy_string(sessiond_sock_path, + DEFAULT_GLOBAL_CLIENT_UNIX_SOCK, + sizeof(sessiond_sock_path)); + } else if (in_tgroup) { + /* Tracing group */ + copy_string(sessiond_sock_path, + DEFAULT_GLOBAL_CLIENT_UNIX_SOCK, + sizeof(sessiond_sock_path)); + + ret = try_connect_sessiond(sessiond_sock_path); + if (ret < 0) { + /* Global session daemon not available */ + if (snprintf(sessiond_sock_path, sizeof(sessiond_sock_path), + DEFAULT_HOME_CLIENT_UNIX_SOCK, + getenv("HOME")) < 0) { + return -ENOMEM; + } + } + } else { + /* Not in tracing group and not root, default */ if (snprintf(sessiond_sock_path, PATH_MAX, DEFAULT_HOME_CLIENT_UNIX_SOCK, getenv("HOME")) < 0) { return -ENOMEM; } - } else { - copy_string(sessiond_sock_path, - DEFAULT_GLOBAL_CLIENT_UNIX_SOCK, - PATH_MAX); } return 0; @@ -290,6 +343,16 @@ static int ask_sessiond(struct lttcomm_session_msg *lsm, void **buf) goto end; } + /* + * Extra protection not to dereference a NULL pointer. If buf is NULL at + * this point, an error is returned and data is freed. + */ + if (buf == NULL) { + ret = -1; + free(data); + goto end; + } + *buf = data; ret = size; @@ -748,11 +811,10 @@ int lttng_calibrate(struct lttng_handle *handle, } /* - * lttng_check_session_daemon + * Check if session daemon is alive. * - * Yes, return 1 - * No, return 0 - * Error, return negative value + * Return 1 if alive or 0 if not. + * On error return -1 */ int lttng_session_daemon_alive(void) { @@ -764,21 +826,16 @@ int lttng_session_daemon_alive(void) return ret; } - /* If socket exist, we check if the daemon listens to connect. */ - ret = access(sessiond_sock_path, F_OK); - if (ret < 0) { - /* Not alive */ - return 0; + if (strlen(sessiond_sock_path) == 0) { + /* No socket path set. Weird error */ + return -1; } - ret = lttcomm_connect_unix_sock(sessiond_sock_path); + ret = try_connect_sessiond(sessiond_sock_path); if (ret < 0) { /* Not alive */ return 0; } - ret = lttcomm_close_unix_sock(ret); - if (ret < 0) - perror("lttcomm_close_unix_sock"); /* Is alive */ return 1;