X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=sidebyside;f=liblttng-ust%2Fltt-events.c;h=9751089c564f6830cb449eceb084200593dab2ae;hb=79dfbf429c229ef733c5d8691a681edb91bee871;hp=9650e8b0703d608492d61ac273e1ef6f1768296b;hpb=e6c12e3dd164fcab19db5985f8729e3d1767571c;p=lttng-ust.git diff --git a/liblttng-ust/ltt-events.c b/liblttng-ust/ltt-events.c index 9650e8b0..9751089c 100644 --- a/liblttng-ust/ltt-events.c +++ b/liblttng-ust/ltt-events.c @@ -94,14 +94,20 @@ int add_pending_probe(struct ltt_event *event, const char *name) { struct cds_hlist_head *head; struct ust_pending_probe *e; - size_t name_len = strlen(name) + 1; - uint32_t hash = jhash(name, name_len - 1, 0); + size_t name_len = strlen(name); + uint32_t hash; + if (name_len > LTTNG_UST_SYM_NAME_LEN - 1) { + WARN("Truncating tracepoint name %s which exceeds size limits of %u chars", name, LTTNG_UST_SYM_NAME_LEN - 1); + name_len = LTTNG_UST_SYM_NAME_LEN - 1; + } + hash = jhash(name, name_len, 0); head = &pending_probe_table[hash & (PENDING_PROBE_HASH_SIZE - 1)]; e = zmalloc(sizeof(struct ust_pending_probe) + name_len); if (!e) return -ENOMEM; - memcpy(&e->name[0], name, name_len); + memcpy(&e->name[0], name, name_len + 1); + e->name[name_len] = '\0'; cds_hlist_add_head(&e->node, head); e->event = event; event->pending_probe = e; @@ -133,10 +139,10 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) struct cds_hlist_node *node, *p; struct ust_pending_probe *e; const char *name = desc->name; - size_t name_len = strlen(name) + 1; - uint32_t hash = jhash(name, name_len - 1, 0); int ret = 0; struct lttng_ust_event event_param; + size_t name_len = strlen(name); + uint32_t hash; /* * For this event, we need to lookup the loglevel. If active (in @@ -209,12 +215,17 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) } } + if (name_len > LTTNG_UST_SYM_NAME_LEN - 1) { + WARN("Truncating tracepoint name %s which exceeds size limits of %u chars", name, LTTNG_UST_SYM_NAME_LEN - 1); + name_len = LTTNG_UST_SYM_NAME_LEN - 1; + } + hash = jhash(name, name_len, 0); head = &pending_probe_table[hash & (PENDING_PROBE_HASH_SIZE - 1)]; cds_hlist_for_each_entry_safe(e, node, p, head, node) { struct ltt_event *event; struct ltt_channel *chan; - if (strcmp(name, e->name)) + if (strncmp(name, e->name, LTTNG_UST_SYM_NAME_LEN - 1)) continue; event = e->event; chan = event->chan; @@ -380,8 +391,8 @@ struct ltt_channel *ltt_channel_create(struct ltt_session *session, size_t subbuf_size, size_t num_subbuf, unsigned int switch_timer_interval, unsigned int read_timer_interval, - int *shm_fd, int *wait_fd, - uint64_t *memory_map_size, + int **shm_fd, int **wait_fd, + uint64_t **memory_map_size, struct ltt_channel *chan_priv_init) { struct ltt_channel *chan = NULL; @@ -490,7 +501,9 @@ int ltt_event_create(struct ltt_channel *chan, * creation). Might require a hash if we have lots of events. */ cds_list_for_each_entry(event, &chan->session->events, list) { - if (event->desc && !strcmp(event->desc->name, event_param->name)) { + if (event->desc && !strncmp(event->desc->name, + event_param->name, + LTTNG_UST_SYM_NAME_LEN - 1)) { ret = -EEXIST; goto exist; }