X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Flttng-ust-comm.c;h=842876fb743c857cf519ff5161d8d333d639bd16;hb=38cb89917116813af9f12bfeb2c389628e2ac901;hp=69414ebd34cc338b4f9f10a3ce02f3af89003239;hpb=2d78951a159c97fd2bfebb84a9b22ef97674d56a;p=lttng-ust.git diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c index 69414ebd..842876fb 100644 --- a/liblttng-ust/lttng-ust-comm.c +++ b/liblttng-ust/lttng-ust-comm.c @@ -43,6 +43,7 @@ #include #include #include +#include #include "tracepoint-internal.h" #include "ltt-tracer-core.h" #include "compat.h" @@ -284,29 +285,32 @@ int handle_message(struct sock_info *sock_info, case LTTNG_UST_FILTER: { /* Receive filter data */ - struct { - uint16_t len; - uint16_t reloc_offset; - char data[FILTER_BYTECODE_MAX_LEN]; - } filter_data; + struct lttng_ust_filter_bytecode *bytecode; - if (lum->u.filter.data_size > 65536) { + if (lum->u.filter.data_size > FILTER_BYTECODE_MAX_LEN) { ERR("Filter data size is too large: %u bytes\n", lum->u.filter.data_size); ret = -EINVAL; goto error; } - len = ustcomm_recv_unix_sock(sock, filter_data.data, + bytecode = zmalloc(sizeof(*bytecode) + lum->u.filter.data_size); + if (!bytecode) { + ret = -ENOMEM; + goto error; + } + len = ustcomm_recv_unix_sock(sock, bytecode->data, lum->u.filter.data_size); switch (len) { case 0: /* orderly shutdown */ ret = 0; + free(bytecode); goto error; case -1: DBG("Receive failed from lttng-sessiond with errno %d", errno); if (errno == ECONNRESET) { ERR("%s remote end closed connection\n", sock_info->name); ret = -EINVAL; + free(bytecode); goto error; } ret = -EINVAL; @@ -318,17 +322,24 @@ int handle_message(struct sock_info *sock_info, } else { ERR("incorrect filter data message size: %zd\n", len); ret = -EINVAL; + free(bytecode); goto end; } } - filter_data.len = lum->u.filter.data_size; - filter_data.reloc_offset = lum->u.filter.reloc_offset; - if (ops->cmd) + bytecode->len = lum->u.filter.data_size; + bytecode->reloc_offset = lum->u.filter.reloc_offset; + if (ops->cmd) { ret = ops->cmd(lum->handle, lum->cmd, - (unsigned long) &filter_data, + (unsigned long) bytecode, &args); - else + if (ret) { + free(bytecode); + } + /* don't free bytecode if everything went fine. */ + } else { ret = -ENOSYS; + free(bytecode); + } break; } default: @@ -917,6 +928,7 @@ void __attribute__((constructor)) lttng_ust_init(void) { struct timespec constructor_timeout; sigset_t sig_all_blocked, orig_parent_mask; + pthread_attr_t thread_attr; int timeout_mode; int ret; @@ -966,13 +978,22 @@ void __attribute__((constructor)) lttng_ust_init(void) ERR("pthread_sigmask: %s", strerror(ret)); } - ret = pthread_create(&global_apps.ust_listener, NULL, + ret = pthread_attr_init(&thread_attr); + if (ret) { + ERR("pthread_attr_init: %s", strerror(ret)); + } + ret = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); + if (ret) { + ERR("pthread_attr_setdetachstate: %s", strerror(ret)); + } + + ret = pthread_create(&global_apps.ust_listener, &thread_attr, ust_listener_thread, &global_apps); if (ret) { ERR("pthread_create global: %s", strerror(ret)); } if (local_apps.allowed) { - ret = pthread_create(&local_apps.ust_listener, NULL, + ret = pthread_create(&local_apps.ust_listener, &thread_attr, ust_listener_thread, &local_apps); if (ret) { ERR("pthread_create local: %s", strerror(ret)); @@ -980,6 +1001,10 @@ void __attribute__((constructor)) lttng_ust_init(void) } else { handle_register_done(&local_apps); } + ret = pthread_attr_destroy(&thread_attr); + if (ret) { + ERR("pthread_attr_destroy: %s", strerror(ret)); + } /* Restore original signal mask in parent */ ret = pthread_sigmask(SIG_SETMASK, &orig_parent_mask, NULL);