我正在Linux内核中处理一些系统调用。既然doublekfree()引发了一个错误,那么有什么好的防范措施呢?
一个显而易见的想法是在NULL之后将指针设置为kfree(),然后在下一个可能的NULL之前检查它是否kfree()。我不确定这样做是否正确。请引导我。

最佳答案

通常,你想通过设计来避免这种情况。几个例子:
kmalloc()在司机的.probe上,而您的kfree()在司机的.remove上。那么您就很好了,probe/remove调用由内核平衡。
kmalloc()在char驱动程序的.open上,而kfree()在驱动程序的.release上。同样好的是,open/release调用由内核平衡。
但是,在某些情况下,由于某种原因,如果对象是被分配的,您只想取消分配,那么您取消指针并在kfree()之前检查的方法是完全正确的。(我想说这是一个设计拙劣的痕迹……但我在那里做过;)
将来,当你有这样一个问题,你想知道一个方法是否足够流行时,你可以浏览内核源代码。查找类似的驱动程序并查看使用了哪些模式。它将给你伟大的洞察力!

07-25 23:58