是什么导致-EPERM以4294967295的形式返回?

时间:2015-01-11 02:46:45

标签: c linux

我正在用我编写的内核模块劫持一个特定的系统调用。替换的代码是:

asmlinkage int custom_setxattr(const char* __user path, const char* __user name, const void* __user value, size_t size, int flags) {
    if (!strncmp("security.checksum.", name, 18) {
        return -EPERM;
    }
    return real_setxattr(path, name, value, size, flags);
}

使用模块运行strace打印出包含此行的分析:

setxattr("file", "security.checksum.value", "Test", 4, 0) = 4294967295

C类型int 已签名,因此我不应该看到值4294967295(将-1解释为无符号整数时得到的值)。这实际上发生在我的另一个系统调用拦截中,而不是其他的。为什么是这样? setxattr能够返回-EPERM

1 个答案:

答案 0 :(得分:0)

看起来strace不够智能,无法知道哪些系统调用返回有符号值,哪些系统调用返回无符号值,因此它只是为所有内容打印无符号值。正如您所指出的,如果将一个32位二进制补码表示形式重新解释为无符号32位整数,则得到4294967295.至少在我的系统上,EPERM被定义为1 }。因此,EPERM表示为无符号的32位整数,为4294967295