使用后释放: KeyDB 在 MODULE UNLOAD 时没有删除模块集群消息接收器
作者: entropy1337创建于 2026年8月28日更新于 2026年8月28日
摘要 当模块注册一个集群消息接收器 (RM_RegisterClusterMessageReceiver) 时,会在全局 clusterReceivers[] 列表中存储一个条目,其中包含模块句柄和一个回调指针,指向模块的 .so。KeyDB 的模块卸载路径 (moduleUnload, src/module.cpp:8806) 会清理命令、共享 API、通知等,但从不删除模块的集群接收器。在 MODULE UNLOAD 之后,clusterReceivers[type] 仍指向一个接收器,其模块/回调引用释放的模块和 dlclose'd .so。该类型的下一个 CLUSTERMSG_TYPE_MODULE 数据包 → moduleCallClusterReceivers 会解引用已释放的模块并调用过期的回调 → 使用后释放。
内容来源: Snapchat/KeyDB