C 防止内核代码中出现双kfree?
我正在linux内核中处理一些系统调用。既然doubleC 防止内核代码中出现双kfree?,c,linux,memory-management,linux-kernel,kernel,C,Linux,Memory Management,Linux Kernel,Kernel,我正在linux内核中处理一些系统调用。既然doublekfree()会引发错误,那么有什么好的防范措施呢 我想到的一个明显的想法是在kfree()之后将指针设置为NULL,并在下一个可能的kfree()之前检查它是否为NULL。我不确定这样做是否正确。请指导我。通常,你希望通过设计避免这种情况。几个例子: kmalloc()在您的驱动程序的上。探测,然后您kfree()在您的驱动程序的上。删除。那么您就很好了,probe/remove调用由内核平衡 在char驱动程序的上打开kmalloc(
kfree()
会引发错误,那么有什么好的防范措施呢
我想到的一个明显的想法是在
kfree()
之后将指针设置为NULL
,并在下一个可能的kfree()
之前检查它是否为NULL
。我不确定这样做是否正确。请指导我。通常,你希望通过设计避免这种情况。几个例子:
在您的驱动程序的kmalloc()
上。探测
,然后您
在您的驱动程序的kfree()
上。删除
。那么您就很好了,
调用由内核平衡probe/remove
- 在char驱动程序的
上打开
,然后在驱动程序的kmalloc()
上释放
。同样好的是,kfree()
调用由内核平衡open/release
kfree()
之前清空指针并进行检查的方法是完全正确的。(我会说这是一个设计拙劣的痕迹……但我曾经在那里做过;)
将来,当您遇到这样的问题时,如果您想知道某个方法是否足够流行,您可以浏览内核源代码。寻找类似的驱动程序,看看使用了什么模式。它将给你巨大的洞察力 通常,您希望通过设计避免这种情况。几个例子:
在您的驱动程序的kmalloc()
上。探测
,然后您
在您的驱动程序的kfree()
上。删除
。那么您就很好了,
调用由内核平衡probe/remove
- 在char驱动程序的
上打开
,然后在驱动程序的kmalloc()
上释放
。同样好的是,kfree()
调用由内核平衡open/release
kfree()
之前清空指针并进行检查的方法是完全正确的。(我会说这是一个设计拙劣的痕迹……但我曾经在那里做过;)
将来,当您遇到这样的问题时,如果您想知道某个方法是否足够流行,您可以浏览内核源代码。寻找类似的驱动程序,看看使用了什么模式。它将给你巨大的洞察力 与非内核代码相同:知道谁拥有指针。@MooingDuck对不起,我没有得到你。我指的是代码中的全局指针,如果这是您的意思的话?
既然double kfree()会引发错误,那么有什么好的防范措施呢?
-最好的防范措施是消除所有doublekfree
,因为这是内核API的错误用法。如果您想调试具体的问题,请使用在这种具体情况下有助于您的任何方法。如果您想允许使用doublekfree
,则需要将指针标记为已释放,最简单的方法是在释放的内存中设置一些标志。@Tsyvarev所以我建议的使用NULL的策略似乎还可以?@bawejakunal如何在普通代码中防止双重释放?与非内核代码相同:知道谁拥有指针。@MooingDuck很抱歉我没有理解你。我指的是代码中的全局指针,如果这是您的意思的话?既然double kfree()会引发错误,那么有什么好的防范措施呢?
-最好的防范措施是消除所有doublekfree
,因为这是内核API的错误用法。如果您想调试具体的问题,请使用在这种具体情况下有助于您的任何方法。如果您想允许使用doublekfree
,则需要将指针标记为已释放,最简单的方法是在已释放的内存中设置一些标志。@Tsyvarev所以我建议的使用NULL的策略似乎是可行的?@bawejakunal如何防止正常代码中的double free?