X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=src%2Flttng-abi.c;h=9b1cceac0d99ce7bd2adc91356fc7fd64ec504bc;hb=2d45aeba7a3f5d738a5b22fe127c1eeaef048e70;hp=974aaff0b888e74504a814f584fa82bc488bdd62;hpb=4071a6283f2291a5894dc6b46608721fc6a56239;p=lttng-modules.git diff --git a/src/lttng-abi.c b/src/lttng-abi.c index 974aaff0..9b1cceac 100644 --- a/src/lttng-abi.c +++ b/src/lttng-abi.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -649,6 +650,8 @@ long lttng_counter_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (validate_zeroed_padding(local_counter_read.padding, sizeof(local_counter_read.padding))) return -EINVAL; + if (local_counter_read.index.number_dimensions > LTTNG_KERNEL_ABI_COUNTER_DIMENSION_MAX) + return -EINVAL; /* Cast all indexes into size_t. */ for (i = 0; i < local_counter_read.index.number_dimensions; i++) @@ -684,6 +687,8 @@ long lttng_counter_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (validate_zeroed_padding(local_counter_aggregate.padding, sizeof(local_counter_aggregate.padding))) return -EINVAL; + if (local_counter_aggregate.index.number_dimensions > LTTNG_KERNEL_ABI_COUNTER_DIMENSION_MAX) + return -EINVAL; /* Cast all indexes into size_t. */ for (i = 0; i < local_counter_aggregate.index.number_dimensions; i++) @@ -715,6 +720,8 @@ long lttng_counter_ioctl(struct file *file, unsigned int cmd, unsigned long arg) if (validate_zeroed_padding(local_counter_clear.padding, sizeof(local_counter_clear.padding))) return -EINVAL; + if (local_counter_clear.index.number_dimensions > LTTNG_KERNEL_ABI_COUNTER_DIMENSION_MAX) + return -EINVAL; /* Cast all indexes into size_t. */ for (i = 0; i < local_counter_clear.index.number_dimensions; i++) @@ -723,7 +730,6 @@ long lttng_counter_ioctl(struct file *file, unsigned int cmd, unsigned long arg) return lttng_kernel_counter_clear(counter, indexes); } default: - WARN_ON_ONCE(1); return -ENOSYS; } } @@ -1000,7 +1006,7 @@ ssize_t lttng_event_notifier_group_notif_read(struct file *filp, char __user *us { struct lttng_event_notifier_group *event_notifier_group = filp->private_data; struct lttng_kernel_ring_buffer_channel *chan = event_notifier_group->chan; - struct lib_ring_buffer *buf = event_notifier_group->buf; + struct lttng_kernel_ring_buffer *buf = event_notifier_group->buf; ssize_t read_count = 0, len; size_t read_offset; @@ -1010,7 +1016,7 @@ ssize_t lttng_event_notifier_group_notif_read(struct file *filp, char __user *us /* Finish copy of previous record */ if (*ppos != 0) { - if (read_count < count) { + if (count != 0) { len = chan->iter.len_left; read_offset = *ppos; goto skip_get_next; @@ -1090,7 +1096,8 @@ nodata: chan->iter.len_left = 0; put_record: - lib_ring_buffer_put_current_record(buf); + if (*ppos == 0) + lib_ring_buffer_put_current_record(buf); return read_count; } @@ -1106,8 +1113,8 @@ unsigned int lttng_event_notifier_group_notif_poll(struct file *filp, unsigned int mask = 0; struct lttng_event_notifier_group *event_notifier_group = filp->private_data; struct lttng_kernel_ring_buffer_channel *chan = event_notifier_group->chan; - struct lib_ring_buffer *buf = event_notifier_group->buf; - const struct lib_ring_buffer_config *config = &chan->backend.config; + struct lttng_kernel_ring_buffer *buf = event_notifier_group->buf; + const struct lttng_kernel_ring_buffer_config *config = &chan->backend.config; int finalized, disabled; unsigned long consumed, offset; size_t subbuffer_header_size = config->cb.subbuffer_header_size(); @@ -1179,7 +1186,7 @@ retry: static int lttng_event_notifier_group_notif_open(struct inode *inode, struct file *file) { struct lttng_event_notifier_group *event_notifier_group = inode->i_private; - struct lib_ring_buffer *buf = event_notifier_group->buf; + struct lttng_kernel_ring_buffer *buf = event_notifier_group->buf; file->private_data = event_notifier_group; return lib_ring_buffer_open(inode, file, buf); @@ -1195,7 +1202,7 @@ static int lttng_event_notifier_group_notif_open(struct inode *inode, struct fil static int lttng_event_notifier_group_notif_release(struct inode *inode, struct file *file) { struct lttng_event_notifier_group *event_notifier_group = file->private_data; - struct lib_ring_buffer *buf = event_notifier_group->buf; + struct lttng_kernel_ring_buffer *buf = event_notifier_group->buf; int ret; ret = lib_ring_buffer_release(inode, file, buf); @@ -1225,7 +1232,7 @@ unsigned int lttng_metadata_ring_buffer_poll(struct file *filp, poll_table *wait) { struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; int finalized; unsigned int mask = 0; @@ -1301,7 +1308,7 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp, { int ret; struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; unsigned int rb_cmd; bool coherent; @@ -1314,7 +1321,7 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp, case LTTNG_KERNEL_ABI_RING_BUFFER_GET_NEXT_SUBBUF: { struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; ret = lttng_metadata_output_channel(stream, chan, NULL); @@ -1332,11 +1339,12 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp, */ return -ENOSYS; } - case LTTNG_KERNEL_ABI_RING_BUFFER_FLUSH_EMPTY: /* Fall-through. */ + case LTTNG_KERNEL_ABI_RING_BUFFER_FLUSH_EMPTY: + lttng_fallthrough; case LTTNG_KERNEL_ABI_RING_BUFFER_FLUSH: { struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; /* @@ -1363,7 +1371,7 @@ long lttng_metadata_ring_buffer_ioctl(struct file *filp, case LTTNG_KERNEL_ABI_RING_BUFFER_GET_NEXT_SUBBUF_METADATA_CHECK: { struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; ret = lttng_metadata_output_channel(stream, chan, &coherent); @@ -1410,7 +1418,7 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp, { int ret; struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; unsigned int rb_cmd; bool coherent; @@ -1423,7 +1431,7 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp, case LTTNG_KERNEL_ABI_RING_BUFFER_GET_NEXT_SUBBUF: { struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; ret = lttng_metadata_output_channel(stream, chan, NULL); @@ -1441,11 +1449,12 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp, */ return -ENOSYS; } - case LTTNG_KERNEL_ABI_RING_BUFFER_FLUSH_EMPTY: /* Fall-through. */ + case LTTNG_KERNEL_ABI_RING_BUFFER_FLUSH_EMPTY: + lttng_fallthrough; case LTTNG_KERNEL_ABI_RING_BUFFER_FLUSH: { struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; /* @@ -1472,7 +1481,7 @@ long lttng_metadata_ring_buffer_compat_ioctl(struct file *filp, case LTTNG_KERNEL_ABI_RING_BUFFER_GET_NEXT_SUBBUF_METADATA_CHECK: { struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; ret = lttng_metadata_output_channel(stream, chan, &coherent); @@ -1521,7 +1530,7 @@ static int lttng_metadata_ring_buffer_open(struct inode *inode, struct file *file) { struct lttng_metadata_stream *stream = inode->i_private; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; file->private_data = buf; /* @@ -1539,7 +1548,7 @@ static 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; + struct lttng_kernel_ring_buffer *buf = stream->priv; mutex_lock(&stream->metadata_cache->lock); list_del(&stream->list); @@ -1556,7 +1565,7 @@ ssize_t lttng_metadata_ring_buffer_splice_read(struct file *in, loff_t *ppos, unsigned int flags) { struct lttng_metadata_stream *stream = in->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; return lib_ring_buffer_splice_read(in, ppos, pipe, len, flags, buf); @@ -1567,7 +1576,7 @@ int lttng_metadata_ring_buffer_mmap(struct file *filp, struct vm_area_struct *vma) { struct lttng_metadata_stream *stream = filp->private_data; - struct lib_ring_buffer *buf = stream->priv; + struct lttng_kernel_ring_buffer *buf = stream->priv; return lib_ring_buffer_mmap(filp, vma, buf); } @@ -1628,7 +1637,7 @@ static int lttng_abi_open_stream(struct file *channel_file) { struct lttng_kernel_channel_buffer *channel = channel_file->private_data; - struct lib_ring_buffer *buf; + struct lttng_kernel_ring_buffer *buf; int ret; void *stream_priv; @@ -1655,7 +1664,7 @@ int lttng_abi_open_metadata_stream(struct file *channel_file) { struct lttng_kernel_channel_buffer *channel = channel_file->private_data; struct lttng_kernel_session *session = channel->parent.session; - struct lib_ring_buffer *buf; + struct lttng_kernel_ring_buffer *buf; int ret; struct lttng_metadata_stream *metadata_stream; void *stream_priv; @@ -1721,7 +1730,7 @@ int lttng_abi_open_event_notifier_group_stream(struct file *notif_file) { struct lttng_event_notifier_group *event_notifier_group = notif_file->private_data; struct lttng_kernel_ring_buffer_channel *chan = event_notifier_group->chan; - struct lib_ring_buffer *buf; + struct lttng_kernel_ring_buffer *buf; int ret; void *stream_priv; @@ -1758,8 +1767,10 @@ int lttng_abi_validate_event_param(struct lttng_kernel_abi_event *event_param) switch (event_param->instrumentation) { case LTTNG_KERNEL_ABI_SYSCALL: switch (event_param->u.syscall.entryexit) { - case LTTNG_KERNEL_ABI_SYSCALL_ENTRY: /* Fall-through */ - case LTTNG_KERNEL_ABI_SYSCALL_EXIT: /* Fall-through */ + case LTTNG_KERNEL_ABI_SYSCALL_ENTRY: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_SYSCALL_EXIT: + lttng_fallthrough; case LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT: break; default: @@ -1783,20 +1794,26 @@ int lttng_abi_validate_event_param(struct lttng_kernel_abi_event *event_param) switch (event_param->u.kretprobe.entryexit) { case LTTNG_KERNEL_ABI_SYSCALL_ENTRYEXIT: break; - case LTTNG_KERNEL_ABI_SYSCALL_ENTRY: /* Fall-through */ - case LTTNG_KERNEL_ABI_SYSCALL_EXIT: /* Fall-through */ + case LTTNG_KERNEL_ABI_SYSCALL_ENTRY: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_SYSCALL_EXIT: + lttng_fallthrough; default: return -EINVAL; } break; - case LTTNG_KERNEL_ABI_TRACEPOINT: /* Fall-through */ - case LTTNG_KERNEL_ABI_KPROBE: /* Fall-through */ + case LTTNG_KERNEL_ABI_TRACEPOINT: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_KPROBE: + lttng_fallthrough; case LTTNG_KERNEL_ABI_UPROBE: break; - case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ - case LTTNG_KERNEL_ABI_NOOP: /* Fall-through */ + case LTTNG_KERNEL_ABI_FUNCTION: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_NOOP: + lttng_fallthrough; default: return -EINVAL; } @@ -1830,18 +1847,23 @@ int lttng_abi_create_event(struct file *channel_file, } switch (event_param->instrumentation) { - case LTTNG_KERNEL_ABI_TRACEPOINT: /* Fall-through */ + case LTTNG_KERNEL_ABI_TRACEPOINT: + lttng_fallthrough; case LTTNG_KERNEL_ABI_SYSCALL: fops = <tng_event_recorder_enabler_fops; break; - case LTTNG_KERNEL_ABI_KPROBE: /* Fall-through */ - case LTTNG_KERNEL_ABI_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_ABI_KPROBE: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_KRETPROBE: + lttng_fallthrough; case LTTNG_KERNEL_ABI_UPROBE: fops = <tng_event_recorder_event_fops; break; - case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ - case LTTNG_KERNEL_ABI_NOOP: /* Fall-through */ + case LTTNG_KERNEL_ABI_FUNCTION: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_NOOP: + lttng_fallthrough; default: return -EINVAL; } @@ -1867,7 +1889,8 @@ int lttng_abi_create_event(struct file *channel_file, goto event_error; switch (event_param->instrumentation) { - case LTTNG_KERNEL_ABI_TRACEPOINT: /* Fall-through */ + case LTTNG_KERNEL_ABI_TRACEPOINT: + lttng_fallthrough; case LTTNG_KERNEL_ABI_SYSCALL: { struct lttng_event_enabler *event_enabler; @@ -1887,8 +1910,10 @@ int lttng_abi_create_event(struct file *channel_file, break; } - case LTTNG_KERNEL_ABI_KPROBE: /* Fall-through */ - case LTTNG_KERNEL_ABI_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_ABI_KPROBE: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_KRETPROBE: + lttng_fallthrough; case LTTNG_KERNEL_ABI_UPROBE: { struct lttng_kernel_event_recorder *event; @@ -1908,8 +1933,10 @@ int lttng_abi_create_event(struct file *channel_file, break; } - case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ - case LTTNG_KERNEL_ABI_NOOP: /* Fall-through */ + case LTTNG_KERNEL_ABI_FUNCTION: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_NOOP: + lttng_fallthrough; default: ret = -EINVAL; goto event_error; @@ -2043,18 +2070,23 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, } switch (event_notifier_param->event.instrumentation) { - case LTTNG_KERNEL_ABI_TRACEPOINT: /* Fall-through */ + case LTTNG_KERNEL_ABI_TRACEPOINT: + lttng_fallthrough; case LTTNG_KERNEL_ABI_SYSCALL: fops = <tng_event_notifier_enabler_fops; break; - case LTTNG_KERNEL_ABI_KPROBE: /* Fall-through */ - case LTTNG_KERNEL_ABI_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_ABI_KPROBE: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_KRETPROBE: + lttng_fallthrough; case LTTNG_KERNEL_ABI_UPROBE: fops = <tng_event_notifier_event_fops; break; - case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ - case LTTNG_KERNEL_ABI_NOOP: /* Fall-through */ + case LTTNG_KERNEL_ABI_FUNCTION: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_NOOP: + lttng_fallthrough; default: ret = -EINVAL; goto inval_instr; @@ -2086,7 +2118,8 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, goto event_notifier_error; switch (event_notifier_param->event.instrumentation) { - case LTTNG_KERNEL_ABI_TRACEPOINT: /* Fall-through */ + case LTTNG_KERNEL_ABI_TRACEPOINT: + lttng_fallthrough; case LTTNG_KERNEL_ABI_SYSCALL: { struct lttng_event_notifier_enabler *enabler; @@ -2110,8 +2143,10 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, break; } - case LTTNG_KERNEL_ABI_KPROBE: /* Fall-through */ - case LTTNG_KERNEL_ABI_KRETPROBE: /* Fall-through */ + case LTTNG_KERNEL_ABI_KPROBE: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_KRETPROBE: + lttng_fallthrough; case LTTNG_KERNEL_ABI_UPROBE: { struct lttng_kernel_event_notifier *event_notifier; @@ -2135,8 +2170,10 @@ int lttng_abi_create_event_notifier(struct file *event_notifier_group_file, break; } - case LTTNG_KERNEL_ABI_FUNCTION: /* Fall-through */ - case LTTNG_KERNEL_ABI_NOOP: /* Fall-through */ + case LTTNG_KERNEL_ABI_FUNCTION: + lttng_fallthrough; + case LTTNG_KERNEL_ABI_NOOP: + lttng_fallthrough; default: ret = -EINVAL; goto event_notifier_error; @@ -2741,9 +2778,9 @@ static int put_u32(uint32_t val, unsigned long arg) static long lttng_stream_ring_buffer_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { - struct lib_ring_buffer *buf = filp->private_data; + struct lttng_kernel_ring_buffer *buf = filp->private_data; struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; - const struct lib_ring_buffer_config *config = &chan->backend.config; + const struct lttng_kernel_ring_buffer_config *config = &chan->backend.config; const struct lttng_kernel_channel_buffer_ops *ops = chan->backend.priv_ops; int ret; @@ -2845,9 +2882,9 @@ error: static long lttng_stream_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { - struct lib_ring_buffer *buf = filp->private_data; + struct lttng_kernel_ring_buffer *buf = filp->private_data; struct lttng_kernel_ring_buffer_channel *chan = buf->backend.chan; - const struct lib_ring_buffer_config *config = &chan->backend.config; + const struct lttng_kernel_ring_buffer_config *config = &chan->backend.config; const struct lttng_kernel_channel_buffer_ops *ops = chan->backend.priv_ops; int ret;