看完整这个函数的上下文:
static void
gss_pipe_destroy_msg(struct rpc_pipe_msg *msg)
{
struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg);
if (msg->errno < 0) {
refcount_inc(&gss_msg->count);
gss_unhash_msg(gss_msg);
if (msg->errno == -ETIMEDOUT)
warn_gssd();
gss_release_msg(gss_msg);
}
gss_release_msg(gss_msg);
}
这个函数显然约定了输入的 msg 不是 NULL(因为上面已经直接用了),从而 gss_msg 也不可能是 NULL,在这里加一个对它是否为 NULL 的判断没有任何意义。
他认为这里有 double free。后面有人解释了,其实没有,只不过原来的代码写得不好,if 里面那一对 refcount_inc/gss_release_msg 是多余的,不仔细看会以为它有 double free 。即便真有 double free,正确的修复方式也是删掉 if 里面那一句 gss_release_msg,他加的那一句判断 gss_msg 是否为 NULL 属于莫名其妙。
【 在 qlogic (戒网了) 的大作中提到: 】
: 标 题: 这段代码可能存在啥问题?
: 发信站: 水木社区 (Fri Apr 23 12:58:41 2021), 转信
:
: 看明大一个博士生提交了一个patch,被批
:
: - xxx_put(msg);
: + if(msg)
: + xxx_put(msg);
:
: 这个修改可能引入什么问题?
:
: 是不是put之前需要检查msg的引用计数,if/put之间不是原子性操作,可能导致问题?
:
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 113.110.224.*]
--
FROM 183.60.88.*