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

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 typeint是有符号的,所以我不应该看到值4294967295(将-1解释为无符号整数时得到的值)。这实际上发生在我的另一个系统调用拦截上,但不是其他的。这是为什么?setxattr能够返回-EPERM

最佳答案

看起来strace不够聪明,无法知道哪个系统调用返回有符号值,哪个返回无符号值,所以它只是为所有内容打印无符号值。如您所指出的,如果将-1的32位双补表示重新解释为无符号32位整数,则会得到4294967295。至少在我的系统中,EPERM被定义为1。因此,表示为无符号32位整数的EPERM4294967295

关于c - 是什么导致-EPERM返回为4294967295?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27883482/

10-11 17:04