Eclipse Mosquitto 1.3.5 版本解析:Broker 内存泄漏、订阅 ACL 与客户端库线程安全的关键修复
后端消息队列消息路由【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mos/mosquitto点击查看免费下载Mosquitto 1.3.5 于 2014 年 10 月 8 日发布是 1.3.x 系列的一个维护性缺陷修复bugfix版本主要覆盖 Broker 与 C 客户端库两部分修复了前导斜杠主题引发的内存泄漏、Windows 平台持久化数据库保存失败、MQTT v3.1.1 订阅 ACL 检查的兼容性问题、SIGHUP 信号导致详细日志被关闭以及客户端库互斥锁按值传递的线程安全缺陷。本文将逐项还原这五处修复的背景、原理与安全影响并结合本仓库当前源码中对应的实现路径帮助读者深入理解 Mosquitto 的主题解析、ACL 检查、持久化与信号处理机制。版本背景一次聚焦稳定性与安全性的维护性发布从官方发布说明看1.3.5 被明确界定为 bugfix release缺陷修复版本不包含新功能全部改动围绕可靠性、兼容性与资源管理展开。版本涵盖两个模块Broker4 项修复涉及内存泄漏、Windows 平台持久化、订阅 ACL 行为与信号处理下的日志开关Client library1 项修复涉及线程同步的互斥锁使用方式。尽管改动清单很短但每一项都指向特定源码路径与具体缺陷模式。下文结合本仓库当前源码中的对应实现逐一展开。Broker 修复详解1. 前导斜杠主题引发的内存泄漏bug #1360985发布说明指出使用带前导斜杠的主题例如/sensors/temp时存在可能的内存泄漏该问题在 1.3.5 中修复。前导斜杠主题在 MQTT 中是合法且具有特殊语义的/foo与foo是两个完全不同的主题层级。Broker 处理此类主题时需要将主题字符串按/分隔符切分为层级。在本仓库的 libcommon/topic_common.c 中mosquitto_sub_topic_tokenise()对订阅主题做 token 化处理时先扫描整个字符串统计/出现的次数以确定层级数量再逐段切分若对空层级即前导或连续分隔符产生的空 token的分配、引用或释放路径处理不当就可能在频繁订阅/退订或消息路由过程中产生泄漏。此类问题的典型触发场景是通配符匹配mosquitto_topic_matches_sub()同文件中的主题匹配实现在处理foo//#、空层级以及#、的边界组合时见 topic_common.c需要反复分配临时层级数组。修复的本质是确保所有 token 分配路径在异常与正常返回分支上都能被对称释放。2. Windows 平台持久化数据库保存失败1.3.5 修复了在 Windows 上保存持久化数据库persistent database失败的问题。Mosquitto 的持久化功能把内存中的消息存储、客户端会话、订阅与保留消息写入磁盘文件供重启后恢复。在当前仓库中持久化写入的核心入口是 src/persist_write.c 的persist__backup()它调用mosquitto_write_file()依次写出数据库魔数magic、CRC 校验、版本号随后通过persist__chunk_cfg_write_v6、persist__message_store_save、persist__client_save、persist__subs_save_all、persist__retain_save_all等函数按块chunk序列化配置、消息存储、客户端、订阅与保留消息见 persist_write.c。跨平台文件写入的常见差异在于二进制模式下\n是否被转换为\r\n、fopen的模式标志wbvsw、以及文件指针定位与刷新行为。若保存路径在 Windows 上以文本模式打开二进制数据库会导致写出的字节流与 Linux 平台不一致进而在重启加载对应 src/persist_read.c 及各版本读取器时校验失败。该修复保证了持久化数据库的写入在 Windows 上与 Unix 系平台保持一致的字节级语义。3. MQTT v3.1.1 订阅时 ACL 检查的临时调整bug #1374291这是 1.3.5 中最具安全讨论价值的一项改动。发布说明原文指出在 MQTT v3.1.1 下暂时禁用订阅时的 ACL 检查原因是用通配符 ACL 去匹配通配符订阅在实现上非常复杂同时强调该改动不构成安全负面影响因为在消息发送给客户端之前仍会执行检查。要理解这一点需要先看 ACL 检查在 Broker 中的两个触发点订阅时客户端发起 SUBSCRIBEBroker 用订阅主题过滤器topic filter做 ACL 检查决定是否允许该订阅。当前仓库中对应 src/handle_subscribe.cmosquitto_acl_check(context, sub.topic_filter, 0, NULL, qos, false, properties, MOSQ_ACL_SUBSCRIBE)被调用若返回MOSQ_ERR_ACL_DENIED则拒绝该订阅——对 MQTT v3.1.1 客户端回0x80拒绝码对 MQTT v5 客户端回MQTT_RC_NOT_AUTHORIZED。消息发送时Broker 决定是否把某条消息投递给某个客户端之前会再次做 ACL 检查。当前仓库中这一逻辑集中在 src/database.c 的db__check_acl_of_all_messages()/db__client_messages_check_acl()对每个客户端入站、出站的 inflight 与 queued 消息以MOSQ_ACL_READ出站或MOSQ_ACL_WRITE入站逐一调用mosquitto_acl_check()不通过的消息直接从队列中删除。问题在于当 ACL 规则本身含通配符如sensors/#、/status而订阅主题过滤器也含通配符如/#时需要判断通配符 ACL 是否覆盖通配符订阅这涉及双层通配符展开与层级交叉匹配实现复杂且容易出错。当时的处理策略是订阅阶段暂时跳过 ACL 检查把安全裁决完全交由消息投递阶段的检查承担。由于每次实际投递前仍会做 ACL 校验未授权客户端最终仍收不到它无权读取的消息因此不会破坏访问控制语义——只是把拒绝时机从订阅时推迟到了投递时。值得注意的是从当前仓库代码看mosquitto_acl_check()在订阅路径上handle_subscribe.c如今已恢复启用说明该临时性调整在后续版本中已被更完善的通配符 ACL 匹配实现所取代。这条修复记录是观察 Mosquitto 访问控制机制演进脉络的典型样本ACL 的最终裁决点始终是消息投递订阅检查只是前置优化。4. SIGHUP 信号导致 -v 详细日志被关闭发布说明指出使用-v开启详细日志时如果 Broker 收到 SIGHUP 信号重载配置详细日志会被意外禁用。该问题在 1.3.5 中修复。SIGHUP 在 Mosquitto 中用于触发配置热重载。当前仓库的信号处理实现在 src/signals.chandle_signal()将 SIGHUP 置为flag_reload标志主循环随后在signal__flag_check()中执行重载流程见 signals.cconfig__read(db.config, true)重新读取配置、重载监听器证书、调用插件 reload、重新初始化安全组件并调用log__close(db.config)log__init(db.config)重建日志子系统。问题根源在于配置重载会把日志相关选项如日志类型、详细程度重置为配置文件中的值如果-v是命令行参数而配置文件里没有对应设置重载后log_type等状态就可能丢失表现为verbose 日志被关闭。1.3.5 的修复确保命令行选项在重载后得以保留使-v的详细日志状态贯穿整个进程生命周期。这与当前代码中配置重载后重新初始化日志并打印Reloading config.信息的行为一脉相承。客户端库修复详解互斥锁被错误地按值传递bug #1373785客户端库部分唯一的修复是mutex互斥锁被错误地按值传递导致线程同步失效。该问题在 1.3.5 中修复。互斥锁必须通过指针共享给所有需要同步的线程按值传递会产生锁的副本使不同线程锁定的实际上是不同的锁对象从而完全丧失互斥语义。这类缺陷在多线程场景下会导致数据竞争例如消息发送线程与网络读取线程同时操作同一个连接对象的发送缓冲区可能产生部分写入、消息错乱甚至崩溃。Mosquitto 客户端库中互斥锁主要用于保护struct mosquitto连接对象内的共享状态如 inflight 消息队列、连接状态标志。修复方式是将所有pthread_mutex_lock()/pthread_mutex_unlock()调用统一改为传递指向锁的指针。在本仓库中客户端库的线程相关实现集中在 lib/thread_mosq.c 与 lib/mosquitto_internal.h配合pthread_compat.h提供跨平台线程抽象。这一修复的意义在于对于mosquitto_loop_start()启动后台线程、主线程同时调用mosquitto_publish()的典型用法保证发布操作与网络线程之间的状态同步是可靠且线程安全的。结语从 1.3.5 看 Mosquitto 的维护哲学Mosquitto 1.3.5 的五项修复呈现出一条清晰的维护主线内存资源的确定性释放前导斜杠主题泄漏、跨平台行为一致性Windows 持久化、安全语义的稳妥取舍订阅 ACL 临时调整 投递阶段兜底、信号与配置重载的状态完整性SIGHUP 后保留-v以及多线程下的正确同步互斥锁传址。其中订阅 ACL 的临时禁用尤其值得注意——它体现了一个长期项目在功能完备性与正确性优先之间的务实平衡当某条路径的实现复杂度短期内不可控时选择由下游更成熟的检查点兜底而不是冒险引入不正确的授权判断。对于希望在当前仓库中进一步验证这些机制的读者建议按如下路径深入主题解析与通配符匹配libcommon/topic_common.cmosquitto_topic_matches_sub、mosquitto_sub_topic_tokenise订阅阶段的 ACL 检查src/handle_subscribe.c消息投递阶段的 ACL 兜底src/database.c持久化写入src/persist_write.c配套读取在 src/persist_read.c信号处理与配置热重载src/signals.c。这些代码路径共同构成了理解 Mosquitto Broker 主题路由、访问控制、持久化与生命周期管理四大核心机制的起点。赞分享后端消息队列消息路由【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mos/mosquitto点击查看免费下载相关推荐Tolaria ADR-0100用前端合成的 Vault 根行统一文件夹导航模型Tolaria ADR 0100用前端合成的 Vault 根行统一文件夹导航模型 Tolaria 的侧边栏文件夹树需要让用户能一键回到 Vault 根目录、浏后端消息队列消息路由Eclipse Mosquitto 2.0.22 发布详解Broker、客户端库与动态安全插件的关键修复Eclipse Mosquitto 2.0.22 发布详解Broker、客户端库与动态安全插件的关键修复 Eclipse Mosquitto 于 2025 年后端消息队列消息路由jcode TUI 颜色体系解析语义角色配色、Oklab 和谐度评分与种子派生调色板jcode TUI 颜色体系解析语义角色配色、Oklab 和谐度评分与种子派生调色板 jcode 的 TUI 中每一个渲染颜色都是用户可配置的且配色好不好可后端消息队列消息路由创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026最新编程学习入门:告别环境配置噩梦,3步搞定微服务开发

2026最新编程学习入门:告别环境配置噩梦,3步搞定微服务开发

2026最新编程学习入门:告别环境配置噩梦,3步搞定微服务开发 是不是刚决定学编程,光装个Python环境就折腾了三天? 打开官网下安装包,选了一堆组件,结果终端一敲 python 还是找不到命令?…

2026/9/23 19:43:53 阅读更多 →
vega-transforms:Vega 数据流处理变换包全解析

vega-transforms:Vega 数据流处理变换包全解析

数据可视化 【免费下载链接】vega A visualization grammar. 项目地址: https://gitcode.com/gh_mirrors/ve/vega 点击查看 免费下载 导读 vega-transforms 是 Vega 可视化语法生态中负责数据加工的核心包,为 Vega 数据流(dataflow&#xf…

2026/9/23 19:43:53 阅读更多 →
Apache Pulsar Elasticsearch Sink Connector 完整指南:配置、Schema 感知与实战部署

Apache Pulsar Elasticsearch Sink Connector 完整指南:配置、Schema 感知与实战部署

消息队列后端流处理 【免费下载链接】pulsar Apache Pulsar - distributed pub-sub messaging system 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar 点击查看 免费下载 Elasticsearch sink connector 是 Apache Pulsar 官方提供的 IO 连接器之一&…

2026/9/23 19:43:53 阅读更多 →

最新新闻

PHP调用FFmpeg实现视频切片

PHP调用FFmpeg实现视频切片

注:使用的视频为mp4,转换成.m3u8播放列表和.ts切片文件1、安装FFmpeg我这边是通过Nux Dextop仓库来安装FFmpeg。(1) 安装EPEL仓库1sudo yum install -y epel-release(2)下载并安装Nux Dextop仓库的RPM包1su…

2026/9/23 21:51:44 阅读更多 →
用 Python 把 PDF 表格批量导入 SQLite

用 Python 把 PDF 表格批量导入 SQLite

处理 PDF 表格数据的场景很常见:季度报表、对账单、业务台账,业务方给一份 PDF 过来,需要结构化后进数据库做后续分析。本文分享一个完整的 Python 实现,覆盖从表格提取、字段清洗、动态建表到批量入库的全流程。代码依赖免费库 F…

2026/9/23 21:51:44 阅读更多 →
windows11_24h2无法安装net3.5办法

windows11_24h2无法安装net3.5办法

1.先下载ISO映像(相同版本的)2.sources目录下的sxs这个文件夹复制到C盘3.以管理员打开命令提示符4.输入dism.exe /online /enable-feature /featurename:netfx3 /Source:C:\sxs5.等待进度100%6.按照下图选中这两个点击确认即可(其他无需在意&…

2026/9/23 21:51:44 阅读更多 →
DeepSeek本地化部署与LoRA微调:三甲医院病历分析诊断模型实战

DeepSeek本地化部署与LoRA微调:三甲医院病历分析诊断模型实战

简介:这是一份面向医疗信息化从业者、数据工程师与临床科研人员的DeepSeek本地化部署实战指南,聚焦三甲医院病历分析与诊断模型构建场景。文档从医疗数据训练概述与DeepSeek模型原理入手,系统讲解环境准备、模型下载与配置、本地化部署、病历…

2026/9/23 21:51:44 阅读更多 →
DeepSeek工业误差实时修正:0.02mm级装配闭环控制方案

DeepSeek工业误差实时修正:0.02mm级装配闭环控制方案

简介:本资源是一份面向工业自动化工程师、智能制造研发人员及AI视觉应用从业者的深度技术方案,聚焦精密装配场景中累积误差的实时修正难题,创新性提出基于DeepSeek大模型的视觉伺服定位校正框架。文档共332页,含50个系统化章节&am…

2026/9/23 21:51:44 阅读更多 →
OpenLayers v3.8.0 版本解析:像素级栅格运算、编辑交互修复与 API 变更盘点

OpenLayers v3.8.0 版本解析:像素级栅格运算、编辑交互修复与 API 变更盘点

前端GIS数据可视化 【免费下载链接】openlayers OpenLayers 项目地址: https://gitcode.com/gh_mirrors/op/openlayers 点击查看 免费下载 导读 v3.8.0 是 OpenLayers 3 系列中一个承上启下的版本,自 v3.7.0 起共合入 33 个 Pull Request,重…

2026/9/23 21:50:43 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →