#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/err.h>
+#include <wrapper/compiler_attributes.h>
#include <wrapper/vmalloc.h> /* for wrapper_vmalloc_sync_mappings() */
#include <wrapper/ringbuffer/vfs.h>
#include <wrapper/ringbuffer/backend.h>
static struct proc_dir_entry *lttng_proc_dentry;
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0))
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,6,0))
static const struct proc_ops lttng_proc_ops;
#else
static const struct file_operations lttng_proc_ops;
}
}
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,6,0))
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,6,0))
static const struct proc_ops lttng_proc_ops = {
.proc_ioctl = lttng_ioctl,
#ifdef CONFIG_COMPAT
*/
return -ENOSYS;
}
- case RING_BUFFER_FLUSH_EMPTY: /* Fall-through. */
+ case RING_BUFFER_FLUSH_EMPTY:
+ lttng_fallthrough;
case RING_BUFFER_FLUSH:
{
struct lttng_metadata_stream *stream = filp->private_data;
*/
return -ENOSYS;
}
- case RING_BUFFER_FLUSH_EMPTY: /* Fall-through. */
+ case RING_BUFFER_FLUSH_EMPTY:
+ lttng_fallthrough;
case RING_BUFFER_FLUSH:
{
struct lttng_metadata_stream *stream = filp->private_data;
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:
+ lttng_fallthrough;
+ case LTTNG_KERNEL_KPROBE:
+ lttng_fallthrough;
+ case LTTNG_KERNEL_KRETPROBE:
+ lttng_fallthrough;
+ case LTTNG_KERNEL_NOOP:
+ lttng_fallthrough;
+ case LTTNG_KERNEL_UPROBE:
+ break;
+
+ case LTTNG_KERNEL_FUNCTION:
+ lttng_fallthrough;
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
static
int lttng_abi_create_event(struct file *channel_file,
struct lttng_kernel_event *event_param)
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;