无法正确访问跟踪点上下文结构字段

时间:2019-08-30 08:42:20

标签: c bpf ebpf tracepoint

目标:仅当使用O_RDONLY标志调用openat时,才在trace_pipe中写入。我已经构建了结构,以查找此处包含的格式/ sys / kernel / debug / tracing / events / syscalls / sys_enter_open / format

问题,我认为我没有访问flags字段,因为看起来第二个if语句始终为false。 问题:我是否正确访问了标志字段?有没有办法打印标志变量内容?

struct syscalls_enter_openat_args {
    __u64 pad;
    int __syscall_nr;
    const char * filename;
    int flags;
    unsigned short modep;
};
SEC("tracepoint/syscalls/sys_enter_openat")
int bpf_sys(struct syscalls_enter_openat_args *ctx)
{
    char fmt[] = "llo\n";
    int flags = ctx->flags;

    if (flags){
        if (flags == O_RDONLY)
            bpf_trace_printk(fmt, sizeof(fmt)); 
    }
    return 0;
}
char _license[] SEC("license") = "GPL";

1 个答案:

答案 0 :(得分:1)

因此您提到以下检查始终评估为false:

if (flags == O_RDONLY)

这可能是因为通过变量O_RDONLY传递给openat()的标志不仅限于flags。在openat()手册页上:

  

参数 flags 必须包含以下访问模式之一O_RDONLYO_WRONLYO_RDWR。这些请求分别打开文件为只读,只写或读/写。

     

此外,可以在标志中按位-添加零个或多个文件创建标志和文件状态标志。 文件创建标志O_CLOEXECO_CREATO_DIRECTORYO_EXCLO_NOCTTYO_NOFOLLOW,{{ 1}}和O_TMPFILE。文件状态标志是下面列出的所有其余标志。这两组标志之间的区别在于,文件创建标志会影响打开操作本身的语义,而文件状态标志会影响后续I / O操作的语义。可以检索和修改文件状态标志(在某些情况下);有关详情,请参见O_TRUNC

因此,与其检查您的fcntl(2)是否等于flags ,不如检查一下它们是否包括标志-这样掩盖它:

O_RDONLY

对于打印if (flags & O_RDONLY) 的值,可能可以通过以下方式进行(未经测试):

flags