我正在用我编写的内核模块劫持一个特定的系统调用。替换的代码是:
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
。
答案 0 :(得分:0)
看起来strace不够智能,无法知道哪些系统调用返回有符号值,哪些系统调用返回无符号值,因此它只是为所有内容打印无符号值。正如您所指出的,如果将一个32位二进制补码表示形式重新解释为无符号32位整数,则得到4294967295.至少在我的系统上,EPERM
被定义为1
}。因此,EPERM
表示为无符号的32位整数,为4294967295
。