Seccomp:为什么以下程序死锁?

时间:2016-08-05 09:52:03

标签: seccomp

我有简单的测试程序:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <pthread.h>

#include <linux/seccomp.h>
#include <sys/prctl.h>
#include <sys/syscall.h>

void *do_work(void *args) {
    prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);
    printf("OK.\n");
}

int main() {
    pthread_t t;
    int ret;
    ret = pthread_create(&t, NULL, do_work, NULL);
    if (ret != 0) {
        printf("Could not create thread, error is %d.\n", ret);
        return 1;
    }
    ret = pthread_join(t, NULL);
    if (ret != 0) {
        printf("Could not join thread, error is %d.\n", ret);
        return 2;
    }
    printf("Program done.\n");
    return 0;
}

这种死锁在Ubuntu 16.04中没有打印任何内容。通过阅读有关seccomp的文档,对我来说,为什么会发生这种情况并不明显。为什么呢? SIGKILL不会杀死整个过程吗?

2 个答案:

答案 0 :(得分:1)

原因是printf功能。

如果您在程序上运行strace -f(没有prctl(PR_SET_SECCOMP, SECCOMP_MODE_STRICT);行),您将看到创建的线程调用futex系统调用。

futex模式禁止调用seccomp,因此线程被终止,因此pthread_join无限期等待。

如果您将printf()替换为write(1,...),该程序将表现出预期的效果。

答案 1 :(得分:1)

创建的线程具有与原始线程不同的进程ID(根据strace)。因此,只有新线程在违反seccomp时才会被杀死。这意味着死锁。