尝试使用`nlmsg_free(skb_out)`释放skb时内核崩溃

MOH*_*MED 3 c linux-kernel

我正在开发一个内核模块,它通过netlink将消息发送到用户空间.

要创建消息(发送邮件): skb_out = nlmsg_new(msg_size,0);.

在发送第一条消息之后,在发送第二条消息之前,我尝试释放skb_out,nlmsg_free(skb_out)但此函数导致内核崩溃.

  • 如何修复此崩溃?

要么

  • 在发送消息后还有其他替代方法来释放skb_out吗?

这里是源代码之后:

            skb_out = nlmsg_new(msg_size,0);
    if(!skb_out)
    {
        printk(KERN_ERR "Failed to allocate new skb\n");
        return;
    }

    nlh=nlmsg_put(skb_out,0,0,NLMSG_DONE,msg_size,0);
    NETLINK_CB(skb_out).dst_group = 0; /* not in mcast group */
    strncpy(nlmsg_data(nlh),msg,msg_size);
    res=nlmsg_unicast(nl_sk,skb_out,pid);
    if(res<0)
    {
        printk(KERN_INFO "Error while sending bak to user\n");
    }

    nlmsg_free(skb_out);
Run Code Online (Sandbox Code Playgroud)

Kri*_*ost 11

在发送之后,您不能释放skb.nlmsg_unicast()将照顾到这一点.

原因很简单:一旦发送消息,它就可以在netlink套接字中排队一段时间,然后才能读取它.只是因为nlmsg_unicast()返回并不意味着套接字的另一端已经收到了消息.如果在收到它之前释放它,最终会在队列中释放一条释放的消息,这会在内核尝试传递时导致崩溃.

只需为每条消息分配一个新的skb.