Race:在 OSX 中卸载 kext 期间的回调和删除回调

Race: callbacks and removing callbacks during unload of kext in OSX

establishing/removing 回调(例如 kauth_unlisten_scope)和回调本身(在 xnu 代码库中,是的,我知道,它已经过时)之间似乎没有同步。这将 tracking/draining 回调和与扩展本身的调用同步的负担。但这也是有问题的,因为有一个 window 注意到一个线程已经退出回调并且实际上从扩展代码中返回。

是否有任何模式可以正确避免这场比赛?或者,Apple 是否有任何文档表明他们已正确同步?

据我所知,没有 100% 可靠的方法来防止 kauth 回调注销竞争条件; API 设计得很糟糕。 Apple 自己 implement/recommend 一个简单的基于原子计数器的机制,您可以在 Kauth-O-Rama example 中看到它。在 KauthORama.c 源文件中搜索 gActivationCount。一个线程在回调中是运行递增之前或者递减之后的代码的可能性还是很小的,但是我从来没有见过由此引起的崩溃。