On 9/3/25 4:44 PM, Alexei Starovoitov wrote:
On Wed, Sep 3, 2025 at 1:52 PM Tom Hromatka tom.hromatka@oracle.com wrote:
On 9/3/25 2:45 PM, Alexei Starovoitov wrote:
On Wed, Sep 3, 2025 at 1:38 PM Tom Hromatka tom.hromatka@oracle.com wrote:
spin_lock_irq(¤t->sighand->siglock);
spin_lock_irq(&task->sighand->siglock);
if (atomic_read(&task->seccomp.filter_count) == 0) {
spin_unlock_irq(&task->sighand->siglock);
spin_unlock_irq(¤t->sighand->siglock);
did you copy this pattern from somewhere ? It's obviously buggy.
I tried to mimic the logic in copy_seccomp() in kernel/fork.c, but as you point out, I probably messed it up :).
Do you have recommendations for a better design pattern?
Several things look wrong here. Double _irq() is one obvious bug.
This snippet addresses the double irq issue. I also added a check to make sure that task != current. (A user shouldn't do that but who knows what they'll actually do.)
if (task == current) { put_task_struct(task); return -EINVAL; }
spin_lock_irq(¤t->sighand->siglock); spin_lock(&task->sighand->siglock);
if (atomic_read(&task->seccomp.filter_count) == 0) { spin_unlock(&task->sighand->siglock); spin_unlock_irq(¤t->sighand->siglock); put_task_struct(task); return -EINVAL; }
get_seccomp_filter(task); current->seccomp = task->seccomp;
spin_unlock(&task->sighand->siglock);
set_task_syscall_work(current, SECCOMP);
spin_unlock_irq(¤t->sighand->siglock);
Let me know if there are other fixes I need to add.
Thanks so much!
Tom