X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=lttng-syscalls.c;h=a4a8ed44cd9c76dbc38d0ce8e319182b9f52392e;hb=72a527538699ab5c72bfb0080a975f04209328b9;hp=cba0016007d95c190fc4a4987c0f727e8a7cefeb;hpb=d42918696623476bb957eae99718e10f7959b320;p=lttng-modules.git diff --git a/lttng-syscalls.c b/lttng-syscalls.c index cba00160..a4a8ed44 100644 --- a/lttng-syscalls.c +++ b/lttng-syscalls.c @@ -91,6 +91,7 @@ struct mmap_arg_struct; #define PARAMS(args...) args /* Handle unknown syscalls */ +#undef TRACE_SYSTEM #define TRACE_SYSTEM syscalls_unknown #include "instrumentation/syscalls/headers/syscalls_unknown.h" #undef TRACE_SYSTEM @@ -1036,6 +1037,8 @@ int lttng_syscall_filter_disable(struct lttng_channel *chan, WARN_ON_ONCE(!chan->sc_table); if (!chan->sc_filter) { + if (!chan->syscall_all) + return -EEXIST; filter = kzalloc(sizeof(struct lttng_syscall_filter), GFP_KERNEL); if (!filter) @@ -1048,6 +1051,14 @@ int lttng_syscall_filter_disable(struct lttng_channel *chan, } if (!name) { + /* Fail if all syscalls are already disabled. */ + if (bitmap_empty(filter->sc, NR_syscalls) + && bitmap_empty(filter->sc_compat, + NR_compat_syscalls)) { + ret = -EEXIST; + goto error; + } + /* Disable all system calls */ bitmap_clear(filter->sc, 0, NR_syscalls); bitmap_clear(filter->sc_compat, 0, NR_compat_syscalls); @@ -1060,18 +1071,18 @@ int lttng_syscall_filter_disable(struct lttng_channel *chan, goto error; } if (syscall_nr >= 0) { - if (!test_bit(syscall_nr, chan->sc_filter->sc)) { + if (!test_bit(syscall_nr, filter->sc)) { ret = -EEXIST; goto error; } - bitmap_clear(chan->sc_filter->sc, syscall_nr, 1); + bitmap_clear(filter->sc, syscall_nr, 1); } if (compat_syscall_nr >= 0) { - if (!test_bit(compat_syscall_nr, chan->sc_filter->sc_compat)) { + if (!test_bit(compat_syscall_nr, filter->sc_compat)) { ret = -EEXIST; goto error; } - bitmap_clear(chan->sc_filter->sc_compat, compat_syscall_nr, 1); + bitmap_clear(filter->sc_compat, compat_syscall_nr, 1); } apply_filter: if (!chan->sc_filter) @@ -1220,12 +1231,12 @@ long lttng_channel_syscall_mask(struct lttng_channel *channel, for (bit = 0; bit < ARRAY_SIZE(sc_table); bit++) { bt_bitfield_write_be(tmp_mask, char, bit, 1, - test_bit(bit, filter->sc)); + filter ? test_bit(bit, filter->sc) : 1); } for (; bit < sc_tables_len; bit++) { bt_bitfield_write_be(tmp_mask, char, bit, 1, - test_bit(bit - ARRAY_SIZE(sc_table), - filter->sc_compat)); + filter ? test_bit(bit - ARRAY_SIZE(sc_table), + filter->sc_compat) : 1); } if (copy_to_user(usyscall_mask->mask, tmp_mask, bitmask_len)) ret = -EFAULT;