fix(gateway,libhttp): 修复进程无法退出bug,完成P0安全问题修复
安全修复(P0): - 修复4处错误消息泄露内部步骤问题,替换为用户友好文案 - 修正拼写错误 "Registe" -> "Registration" - 修正注册失败HTTP状态码 400 -> 500 - 所有P0严重问题100%修复,安全评级提升至A- 稳定性修复(关键): - 修复信号处理非async-signal-safe问题:仅设置原子标志,杜绝死锁 - 新增SIGPIPE忽略处理,防止写关闭socket时进程意外终止 - 修复Listener::doAccept()关闭后无限递归导致CPU 100%空转bug - 新增Listener::close()方法,stop()先关闭acceptor再停止ioc - 改进stop()流程:acceptor->WS客户端->ioc->worker线程 有序关闭 - 新增双重超时保护:stop() 8秒、日志flush 3秒,超时强制exit保证进程绝不挂死 - 服务器事件循环改为独立线程运行,主线程负责信号检测和关闭协调 文档: - 新增CHANGELOG.md更新日志 - 更新gateway安全审计文档,添加稳定性修复记录 - 更新docs/INDEX.md文档索引
This commit is contained in:
1 parent
b33c5e6d1d
commit
e815f0ec40
7 files changed
+263
-17
No files matched your search
@@ -18,7 +18,9 @@
|
||||
|
||||
> 对比 2026-08-01 版本:修复率从 18% 提升至 56%,**所有P0严重问题已全部修复**,核心安全机制(Token吊销、错误信息脱敏)已落地。
|
||||
>
|
||||
> **更新日志**(2026-08-07 P0修复):完成P0-3修复,将4处暴露内部步骤的错误消息替换为用户友好文案,修正拼写错误和状态码错误。
|
||||
> **更新日志**:
|
||||
> - 2026-08-07 P0修复:完成P0-3修复,将4处暴露内部步骤的错误消息替换为用户友好文案,修正拼写错误和状态码错误。
|
||||
> - 2026-08-07 稳定性修复:修复进程无法正常退出("杀不死")问题,包括信号处理安全、Listener无限递归CPU 100%、关闭超时保护等多个关键bug。
|
||||
|
||||
---
|
||||
|
||||
@@ -280,6 +282,37 @@ gateway:8443 [鉴权 + Token + 限流 + 代理白名单 + 路径校验]
|
||||
|
||||
---
|
||||
|
||||
## 🟢 稳定性修复(2026-08-07)
|
||||
|
||||
在安全审计过程中发现并修复了 gateway 进程"杀不死"问题,这是一个严重影响服务可靠性的bug:
|
||||
|
||||
### 修复的问题
|
||||
|
||||
| # | 问题 | 严重程度 | 位置 | 修复方式 |
|
||||
|---|------|----------|------|----------|
|
||||
| 1 | 信号处理函数调用非 async-signal-safe 函数(std::cout、_SERVE->stop()、锁),可能死锁 | 高 | `main.cpp:763-767` | 改为仅设置 `volatile sig_atomic_t` 标志,主线程轮询后安全关闭 |
|
||||
| 2 | 未处理 SIGPIPE,写关闭socket时进程可能被内核意外终止 | 中 | `main.cpp` | 新增 SIGPIPE 忽略处理 |
|
||||
| 3 | Listener::doAccept() acceptor关闭后仍无条件递归,导致CPU 100%空转 | **严重** | `HttpServer_Listener.cpp:46` | 检查acceptor状态,关闭或operation_aborted时停止递归 |
|
||||
| 4 | stop()未先关闭acceptor,停止过程中仍接受新连接 | 中 | `HttpServer.cpp:98-113` | 新增Listener::close()方法,stop()先关acceptor再停ioc |
|
||||
| 5 | stop()/shutdown()无超时保护,网络IO阻塞时join线程永久挂起 | 高 | `main.cpp` | stop() 8秒超时,日志flush 3秒超时,超时强制exit保证进程退出 |
|
||||
| 6 | 主线程直接运行ioc->run(),无法安全响应信号 | 中 | `main.cpp` | 服务器在独立线程运行,主线程负责信号检测和关闭协调 |
|
||||
|
||||
### 修复后的关闭保证
|
||||
|
||||
- **进程绝不挂死**:双重超时保护,极端情况下最多11秒内必定退出
|
||||
- **信号处理安全**:杜绝信号处理函数中的死锁风险
|
||||
- **资源正确清理**:acceptor→WS客户端→ioc→worker线程 有序关闭
|
||||
- **SIGPIPE防护**:写关闭连接不再导致进程意外终止
|
||||
|
||||
### 修改文件
|
||||
|
||||
- `gateway/src/main.cpp` - 信号处理安全重构、超时保护、独立服务器线程
|
||||
- `libhttp/src/HttpServer.cpp` - 改进stop()流程顺序
|
||||
- `libhttp/src/HttpServer_Listener.cpp` - 修复无限递归bug,新增close()
|
||||
- `libhttp/inc/us/detail/HttpServerImpl.hpp` - 添加Listener::close()声明
|
||||
|
||||
---
|
||||
|
||||
**审计人**: AI Security Auditor
|
||||
**复审日期**: 2026-08-07
|
||||
**下一次复审建议**: 修复P1问题后或代码有重大变更时
|
||||
Reference in new issue
Block a user