我正在Linux内核中处理一些系统调用。既然doublekfree()
引发了一个错误,那么有什么好的防范措施呢?
一个显而易见的想法是在NULL
之后将指针设置为kfree()
,然后在下一个可能的NULL
之前检查它是否kfree()
。我不确定这样做是否正确。请引导我。
最佳答案
通常,你想通过设计来避免这种情况。几个例子:kmalloc()
在司机的.probe
上,而您的kfree()
在司机的.remove
上。那么您就很好了,probe/remove
调用由内核平衡。kmalloc()
在char驱动程序的.open
上,而kfree()
在驱动程序的.release
上。同样好的是,open/release
调用由内核平衡。
但是,在某些情况下,由于某种原因,如果对象是被分配的,您只想取消分配,那么您取消指针并在kfree()
之前检查的方法是完全正确的。(我想说这是一个设计拙劣的痕迹……但我在那里做过;)
将来,当你有这样一个问题,你想知道一个方法是否足够流行时,你可以浏览内核源代码。查找类似的驱动程序并查看使用了哪些模式。它将给你伟大的洞察力!