X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Flttng-abi.c;h=219d20a044e284c63f1688a9a06df514b28bceb6;hb=badfe9f5c396efb1b00e5f2abcded2e4ac4a5bac;hp=312372fcb9bbc5d83bcc59011ad5834e6131d626;hpb=876e2e9225074dede98488270dee7226e73d2a63;p=lttng-modules.git diff --git a/src/lttng-abi.c b/src/lttng-abi.c index 312372fc..219d20a0 100644 --- a/src/lttng-abi.c +++ b/src/lttng-abi.c @@ -1080,7 +1080,7 @@ int lttng_metadata_ring_buffer_open(struct inode *inode, struct file *file) * session, we need to keep our own reference on the transport. */ if (!try_module_get(stream->transport->owner)) { - printk(KERN_WARNING "LTT : Can't lock transport module.\n"); + printk(KERN_WARNING "LTTng: Can't lock transport module.\n"); return -EBUSY; } return lib_ring_buffer_open(inode, file, buf); @@ -1092,8 +1092,12 @@ int lttng_metadata_ring_buffer_release(struct inode *inode, struct file *file) struct lttng_metadata_stream *stream = file->private_data; struct lib_ring_buffer *buf = stream->priv; + mutex_lock(&stream->metadata_cache->lock); + list_del(&stream->list); + mutex_unlock(&stream->metadata_cache->lock); kref_put(&stream->metadata_cache->refcount, metadata_cache_destroy); module_put(stream->transport->owner); + kfree(stream); return lib_ring_buffer_release(inode, file, buf); } @@ -1230,7 +1234,7 @@ int lttng_abi_open_metadata_stream(struct file *channel_file) * session, we need to keep our own reference on the transport. */ if (!try_module_get(metadata_stream->transport->owner)) { - printk(KERN_WARNING "LTT : Can't lock transport module.\n"); + printk(KERN_WARNING "LTTng: Can't lock transport module.\n"); ret = -EINVAL; goto notransport; } @@ -1245,8 +1249,10 @@ int lttng_abi_open_metadata_stream(struct file *channel_file) if (ret < 0) goto fd_error; + mutex_lock(&session->metadata_cache->lock); list_add(&metadata_stream->list, &session->metadata_cache->metadata_stream); + mutex_unlock(&session->metadata_cache->lock); return ret; fd_error: @@ -1260,6 +1266,46 @@ nomem: return ret; } +static +int lttng_abi_validate_event_param(struct lttng_kernel_event *event_param) +{ + /* Limit ABI to implemented features. */ + switch (event_param->instrumentation) { + case LTTNG_KERNEL_SYSCALL: + switch (event_param->u.syscall.entryexit) { + case LTTNG_KERNEL_SYSCALL_ENTRYEXIT: + break; + default: + return -EINVAL; + } + switch (event_param->u.syscall.abi) { + case LTTNG_KERNEL_SYSCALL_ABI_ALL: + break; + default: + return -EINVAL; + } + switch (event_param->u.syscall.match) { + case LTTNG_SYSCALL_MATCH_NAME: + break; + default: + return -EINVAL; + } + break; + + case LTTNG_KERNEL_TRACEPOINT: /* Fallthrough */ + case LTTNG_KERNEL_KPROBE: /* Fallthrough */ + case LTTNG_KERNEL_KRETPROBE: /* Fallthrough */ + case LTTNG_KERNEL_NOOP: /* Fallthrough */ + case LTTNG_KERNEL_UPROBE: + break; + + case LTTNG_KERNEL_FUNCTION: /* Fallthrough */ + default: + return -EINVAL; + } + return 0; +} + static int lttng_abi_create_event(struct file *channel_file, struct lttng_kernel_event *event_param) @@ -1301,6 +1347,9 @@ int lttng_abi_create_event(struct file *channel_file, ret = -EOVERFLOW; goto refcount_error; } + ret = lttng_abi_validate_event_param(event_param); + if (ret) + goto event_error; if (event_param->instrumentation == LTTNG_KERNEL_TRACEPOINT || event_param->instrumentation == LTTNG_KERNEL_SYSCALL) { struct lttng_enabler *enabler; @@ -2012,7 +2061,7 @@ int __init lttng_abi_init(void) <tng_proc_ops, NULL); if (!lttng_proc_dentry) { - printk(KERN_ERR "Error creating LTTng control file\n"); + printk(KERN_ERR "LTTng: Error creating control file\n"); ret = -ENOMEM; goto error; }