+ -
当前位置:首页 → 问答吧 → 一段代码,求教

一段代码,求教

时间:2010-08-02

来源:互联网

本帖最后由 kitifaye 于 2010-08-02 15:53 编辑

下面是selinux中一个函数代码
int avc_has_perm_noaudit(u32 ssid, u32 tsid,
                         u16 tclass, u32 requested,
                         unsigned flags,
                         struct av_decision *in_avd)
{
        struct avc_node *node;
        struct av_decision avd_entry, *avd;
        int rc = 0;
        u32 denied;

        BUG_ON(!requested);

        rcu_read_lock();

        node = avc_lookup(ssid, tsid, tclass);
        if (!node) {
                rcu_read_unlock();

                if (in_avd)
                        avd = in_avd;
                else
                        avd = &avd_entry;
                rc = security_compute_av(ssid, tsid, tclass, requested, avd);
                if (rc)
                        goto out;
                rcu_read_lock();
                node = avc_insert(ssid, tsid, tclass, avd);
        } else {
                if (in_avd)
                        memcpy(in_avd, &node->ae.avd, sizeof(*in_avd));
                avd = &node->ae.avd;
        }

        denied = requested & ~(avd->allowed);

        if (denied) {
                if (flags & AVC_STRICT)
                        rc = -EACCES;
                else if (!selinux_enforcing || (avd->flags & AVD_FLAGS_PERMISSIVE))
                        avc_update_node(AVC_CALLBACK_GRANT, requested, ssid,
                                        tsid, tclass, avd->seqno);
                else
                        rc = -EACCES;
        }

        rcu_read_unlock();
out:
        return rc;
}

此函数中定义了一个avd_entry(红色),就在一个地方用到,看起来好像没什么作用
是不是多余的?小子菜鸟,请大仙们指点,不胜感激

作者: kitifaye   发布时间: 2010-08-02

有很多地方用了 avd 这个啊

作者: zliming   发布时间: 2010-08-02

多余倒不是,这一句
  1. if (in_avd)
  2.                         avd = in_avd;
  3.                 else
  4.                         avd = &avd_entry;
复制代码
如果传入参数中in_avd有效,就利用那个,否则就自己开个avd的空间使用,大概是这个意思

作者: daybreakcx   发布时间: 2010-08-02

回复 zliming


    avd是用到了,可是avd_entry定义后 也没有初始化赋值什么的
后面就有
                 if (in_avd)
                         avd = in_avd;
                 else
                         avd = &avd_entry;

后面是用到了avd,可是avd_entry再也没用到,不知道这里是什么用?

作者: kitifaye   发布时间: 2010-08-02

楼主要不再  学学C语言试试

作者: zhangsuozhu   发布时间: 2010-08-02



QUOTE:
多余倒不是,这一句如果传入参数中in_avd有效,就利用那个,否则就自己开个avd的空间使用,大概是这个意思: ...
daybreakcx 发表于 2010-08-02 16:16




    avd_entry定义后 也没有初始化赋值什么的,
avd = &avd_entry;
这个有什么用呢?

作者: kitifaye   发布时间: 2010-08-02



QUOTE:
楼主要不再  学学C语言试试
zhangsuozhu 发表于 2010-08-02 16:19




    您的解释 就是我的学习。。。

作者: kitifaye   发布时间: 2010-08-02



QUOTE:
avd_entry定义后 也没有初始化赋值什么的,
avd = &avd_entry;
这个有什么用呢?
kitifaye 发表于 2010-08-02 16:20




    提供空间后头调用会往里头写东西啊,如security_compute_av这样的函数,你把地址传入,它往地址里写东西,这样以后你就获得数据了

作者: daybreakcx   发布时间: 2010-08-02

回复 daybreakcx


    明白了。。。

作者: kitifaye   发布时间: 2010-08-02

  1. rc = security_compute_av(ssid, tsid, tclass, requested, avd);
复制代码
可能会对avd赋值。
avd是执行av_entry的指针,操作avd也就操作了av_entry

作者: ljysyn   发布时间: 2010-08-02

相关阅读 更多