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)
}
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);
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)