2012-04-13 33 views
2

我正在开发一个内核模块,通过netlink发送消息到用户空间。内核崩溃当试图释放skb与`nlmsg_free(skb_out)`

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

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

  • 如何解决这个崩溃?

  • 是否有其他替代消息发送后,FRE的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); 

回答

10

不允许你以释放SKB你送了上去。 nlmsg_unicast()会照顾到这一点。

原因很简单:一旦发送消息,它可以在任何人阅读之前在netlink套接字中排队一段时间。仅仅因为nlmsg_unicast()返回它并不意味着套接字的另一端已经收到消息。如果您在收到它之前释放它,则最终会在队列中释放一条已释放的消息,这会在内核尝试传递消息时导致崩溃。

简单地为每条消息分配一个新的skb。

+0

我需要你的帮助:http://stackoverflow.com/questions/23852866/netlink-giving-kernel-panic – SGG 2014-05-26 06:37:25