mORMot2 Daily每日上游提交速读

异步关闭修复泄漏,HTTP 超时按阶段拆分

这是一期影响较大的网络更新。异步服务器、隧道与 RTSP-over-HTTP 协同修复了所有权和关闭流程,TSynThreadPool 也消除了可能让排队任务一直休眠的竞争。HTTP 客户端新增独立的连接、发送和接收超时,Kerberos 服务端认证则统一到跨平台 wrapper,并移除一个公开方法。

要点

  • TSynThreadPool now clears a worker's processing state under the pending-queue lock, preventing a queued task from being stranded by a wake-up race.
  • Async socket, tunnel and RTSP-over-HTTP cleanup now closes file descriptors and transferred connections on failure and shutdown paths.
  • TCrtSocket and HTTP clients now expose separate connect, send and receive timeouts; use 0, not a negative value, when requesting legacy fallback on a live TCrtSocket.
  • TServerSspiKeyTab.ComputeServerHeader is removed; migrate direct callers to KerberosServerAuthHeader and prepare a POSIX keytab explicitly when required.
  • Delphi users should land on build 2.4.17398, which repairs compilation after the timeout constructor refactor.

升级建议

异步服务器、隧道和 RTSP 部署应升级到最终 build 2.4.17398,并覆盖空闲连接、部分请求和待发送数据下的关闭测试。Delphi 用户不要停在 2.4.17393–2.4.17397。升级前搜索 TServerSspiKeyTab.ComputeServerHeader,并把直接调用改为 KerberosServerAuthHeader。

版本号2.4.17372 → 2.4.17398
提交26
行数+1199 -716
阅读2 分钟

25 条中的 25 条 · 上游 26 次提交

主题
# 条目 类别 单元
1 严重 线程池唤醒竞争可能让排队任务永久搁置 TSynThreadPool.PopPendingContext 现在接收调用线程,并在持有 fPendingSafe 时清除其 fProcessingContext。因此队列检查与 worker 空闲状态发布相对于 Push 成为原子操作。 修复 mormot.core.threads+1 4860cac1+18-20

core: fixed TSynThreadPool.PopPendingContext race condition

影响

在非 IOCP 线程池路径上,Push 不会再把任务排到即将休眠且未被唤醒的 worker 后面。这避免了异步待处理任务一直停滞到无关事件到来。

Arnaud Bouchez · 14:10 UTC · 在 GitHub 上查看该提交 →

2 高 直接 keytab HTTP 认证方法已移除 TServerSspiKeyTab.ComputeServerHeader 被删除。TServerSspiKeyTab 新增 FileSetter 与 nil-safe KeyTab getter,ServerSspiDataNtlm 也会先确认输入至少有四字节再读取 cardinal。 破坏性变更 mormot.lib.gssapi+1 03373d42+46-61

lib: removed TServerSspiKeyTab.ComputeServerHeader

影响

调用 ComputeServerHeader 的应用将无法编译。短小的畸形 SSPI/GSSAPI token 现在会被拒绝,不再越界读取 cardinal。

需要迁移

搜索 TServerSspiKeyTab.ComputeServerHeader,改为调用 KerberosServerAuthHeader;POSIX 使用特定 keytab 时先调用 PrepareKeyTab。

公开 API

  • TServerSspiKeyTab.ComputeServerHeaderremoved — 请使用 mormot.net.client 中的 KerberosServerAuthHeader。
  • TServerSspiKeyTab.FileSetteradded

Arnaud Bouchez · 11:54 UTC · 在 GitHub 上查看该提交 →

3 高 异步服务器关闭现在覆盖所有连接退出路径 TAsyncConnections 现在关闭待处理读取、等待 worker 与 accept loop、释放已跟踪连接、允许最终 GC 插入,并修正 ConnectionDelete 与 EndConnection 顺序。客户端请求失败路径也会统一中止已转移连接。 修复 mormot.net.async+1 c87c00ab+92-50

net: avoid connection leaks in async server

影响

长期运行的 Delphi 与 FPC 异步服务器在关闭、accept 失败和客户端设置错误时可避免连接对象与 socket 泄漏。销毁会先等待 worker 所有权稳定,再释放共享状态。

Arnaud Bouchez · 09:08 UTC · 在 GitHub 上查看该提交 →

4 高 RTSP-over-HTTP 设置会清理所有部分接管的连接 TRtspOverHttpServer.ConnectionCreate 显式跟踪 GET、POST 与 RTSP 连接所有权,并在 finally 中释放每个对象或原始 RTSP socket,除非所有权已成功转移。 修复 mormot.net.rtsphttp 213dd8c6+50-33

net: fixed potential leaks in TRtspOverHttpServer

影响

失败或中断的 RTSP-over-HTTP 配对不再泄漏 socket 和连接对象。现有 Delphi 与 FPC 应用 API 不变。

Arnaud Bouchez · 08:15 UTC · 在 GitHub 上查看该提交 →

5 高 隧道失败路径会关闭两端 socket TTunnelLocalThread.Destroy 关闭 fServerSock 与 fClientSock;TTunnelLocal.Open 和 OpenSocket 在异常及设置失败时使用 ShutdownAndClose,并将已转移 socket 置 nil。 修复 mormot.net.tunnel 2eb90dbc+17-5

net: fixed FD socket leak in TTunnelLocal

影响

反复失败的隧道打开不再在 POSIX、Delphi 或 FPC 目标上累积文件描述符或 socket handle。

Arnaud Bouchez · 08:21 UTC · 在 GitHub 上查看该提交 →

6 高 异步连接销毁会关闭 Stop 遗留的 socket TPollAsyncConnection.Destroy 现在释放 fSecure,将 linger 设为立即关闭,并在 Stop 后 fSocket 仍有值时调用 ShutdownAndClose。 修复 mormot.net.async 5707c869+19-2

net: fixed TPollAsyncConnection.Destroy

影响

销毁部分停止的异步连接时不再遗留打开的 socket handle。该修复适用于 Delphi 与 FPC 异步 backend。

Arnaud Bouchez · 07:43 UTC · 在 GitHub 上查看该提交 →

7 高 即使 epoll 移除失败,取消订阅也会关闭 socket 当 fUnsubscribeShutdownSocket 启用时,TPollSocketEpoll.Unsubscribe 将原始 socket 的关闭移出 EPOLL_CTL_DEL 成功分支;即使 epoll 描述符已不可用也会关闭。 修复 mormot.net.sock 54de4647+11-10

net: fixed leaking socket FD in TPollSocketEpoll.Unsubscribe

影响

Linux 及其他基于 epoll 的服务器在取消订阅与拆除竞争或 EPOLL_CTL_DEL 失败时不再泄漏文件描述符。Windows 与非 epoll backend 不受影响。

Arnaud Bouchez · 06:34 UTC · 在 GitHub 上查看该提交 →

8 高 HTTP 超时重构后的 Delphi 编译已恢复 TCrtSocket 构造器现在调用受保护的虚方法 DoCreate,THttpClientSocket 则覆盖 DoCreate,不再重新声明 Create。这样保留了子类初始化,同时消除了 Delphi 的构造器冲突。 编译器与平台 mormot.net.client+1 fd5b3409+24-24

net: fixed Delphi compilation of THttpClientSocket

影响

完整的超时系列重新可在 Delphi 下编译。FPC 使用相同初始化路径,但应用代码无需修改。

Arnaud Bouchez · 21:12 UTC · 在 GitHub 上查看该提交 →

9 中 异步连接注册前的回滚逻辑得到集中 受保护的 TAsyncConnections.ConnectionAbortAndNil 现在会清空调用者引用、保留调用者拥有的 socket,通过 fSockets 关闭已注册连接,并直接释放未注册实例。 修复 mormot.net.async 3742e9a7+62-25

net: new TAsyncConnections.ConnectionAbortAndNil method

影响

框架失败路径现在使用统一所有权规则,降低重复释放和泄漏风险。该 helper 为 protected,不新增公开应用 API。

Arnaud Bouchez · 08:09 UTC · 在 GitHub 上查看该提交 →

10 中 隧道关闭不再调用缺失的 transmit closure TTunnelLocal.SendFrame 在隧道终止时发送关闭帧前,会先检查 fTransmit 是否已赋值。 修复 mormot.net.tunnel fbb9dc6b+1-1

tun - fix nil transmit try to send frame

影响

Delphi 与 FPC build 的隧道拆除可避免调用 nil closure。应用代码无需迁移。

tprudhomme · 08:21 UTC · 在 GitHub 上查看该提交 →

11 中 Socket 新增独立的连接、发送和接收超时 TCrtSocket 新增 SetTimeouts 与 ConnectTimeout,并让 SendTimeout 和 ReceiveTimeout 同时可读写。连接、代理、TLS、发送和接收路径分别选择对应阶段值。 新功能 mormot.net.sock 221f7715+181-81

net: introduce 3 specific timeouts to TCrtSocket

影响

Delphi 与 FPC 代码可将慢速建连与请求/响应 I/O 分开调节。阶段值保持 0 时,现有 TimeOut 代码继续提供默认值。

值得一看

公开 API

  • TCrtSocket.SetTimeoutsadded
  • TCrtSocket.ConnectTimeoutadded
  • TCrtSocket.SendTimeoutbehaviour-changed — 该属性现在同时可读写。
  • TCrtSocket.ReceiveTimeoutbehaviour-changed — 该属性现在同时可读写。

Arnaud Bouchez · 16:32 UTC · 在 GitHub 上查看该提交 →

12 中 统一的 Kerberos HTTP helper 同时服务 Windows 与 POSIX KerberosServerAuthHeader 将单轮 Negotiate helper 移到 mormot.net.client,拒绝 NTLM,并供 SSPI 与 GSSAPI 服务端授权共同使用。NOKERBEROSCLIENT 可排除该 helper。 新功能 mormot.lib.gssapi+3 0bc90ef6+79-75

net: new HTTP "Negotiate" KerberosServerAuthHeader() wrapper

影响

自定义 Delphi 与 FPC HTTP 服务器可在 Windows 和 POSIX 上使用同一公开 helper。它仅支持简单的两消息 Kerberos 交换,不支持 NTLM 或多轮协商。

值得一看

公开 API

  • KerberosServerAuthHeaderadded — mormot.net.client 中的最终跨平台名称。

Arnaud Bouchez · 12:18 UTC · 在 GitHub 上查看该提交 →

13 中 扩展 HTTP 选项携带三个独立超时 THttpRequestExtendedOptions 新增 ConnectTimeoutMS、SendTimeoutMS、ReceiveTimeoutMS 与 GetTimeouts。序列化使用 tm、tc、ts、tr 字段,HTTP backend 在打开请求时使用解析后的值。 新功能 mormot.net.client ad936f42+71-13

net: extended THttpRequestExtendedOptions to include the timeouts

影响

Delphi 与 FPC 应用可分别配置请求各阶段,已有的全零 record 仍通过 CreateTimeoutMS 与 backend 默认值回退。

值得一看

公开 API

  • THttpRequestExtendedOptions.ConnectTimeoutMSadded
  • THttpRequestExtendedOptions.SendTimeoutMSadded
  • THttpRequestExtendedOptions.ReceiveTimeoutMSadded
  • THttpRequestExtendedOptions.GetTimeoutsadded

Arnaud Bouchez · 17:11 UTC · 在 GitHub 上查看该提交 →

14 中 REST socket 客户端统一应用分阶段超时 TRestHttpClientSocket 将超时保存到 fExtendedOptions,在连接前通过 OpenOptions 传递,并在判断 socket 是否可复用时比较这些值。TCrtSocket getter 现在仅在阶段值为 0 时使用 TimeOut。 新功能interp mormot.net.sock+1 50ade795+46-36

rest: properly use new THttpClientSocket timeouts

影响

REST 客户端可在重连过程中保持不同的连接、发送和接收策略。在最终实现中,活动 TCrtSocket 的负阶段值不再选择旧超时回退。

值得一看

请用 0 表示旧超时回退,并测试配置分阶段超时后的重连行为。

Arnaud Bouchez · 21:06 UTC · 在 GitHub 上查看该提交 →

15 中 REST SSPI 认证可选择 POSIX keytab 在 POSIX 上,TRestServerAuthenticationSspi 新增由 TServerSspiKeyTab 支持的 KeyTab 属性。设置有效文件会初始化 GSSAPI 凭据,Idle 会刷新已更改的 keytab。 新功能 mormot.rest.server be652e42+30-2

rest: optional TRestServerAuthenticationSspi.KeyTab support with GSSAPI

影响

POSIX REST 服务器可使用显式且可热刷新的 keytab,不必只依赖默认 GSSAPI 凭据。Windows SSPI 行为不变。

值得一看

公开 API

  • TRestServerAuthenticationSspi.KeyTabadded — 仅在 POSIX build 中可用。

Arnaud Bouchez · 11:57 UTC · 在 GitHub 上查看该提交 →

16 中 REST 客户端在连接前设置超时策略 TRestHttpClientSocket 现在在 Connect 前创建并配置 THttpClientSocket,因此连接、代理和 TLS 建立阶段都会使用指定超时,而不只是后续 I/O。 新功能 mormot.rest.http.client 29dc590a+17-6

rest: enhance TRestHttpClientSocket to use the new timeouts

影响

Delphi 与 FPC backend 的 REST 连接现在可分别控制建连、写入和读取超时。

值得一看

Arnaud Bouchez · 16:45 UTC · 在 GitHub 上查看该提交 →

17 中 异步服务器在关闭开始时立即唤醒轮询循环 TAsyncConnections.Destroy 在等待前先将 fSockets 标记为终止,并唤醒 POSIX 读写 poller。相关 HTTP 与代理关闭路径不再等待正常轮询超时。 性能 mormot.net.async+1 2b1b93ae+9-4

net: faster async server shutdown

影响

POSIX 异步服务器和代理客户端应能更快、更可预测地终止。Delphi Windows IOCP build 不使用这些轮询唤醒分支。

Arnaud Bouchez · 12:44 UTC · 在 GitHub 上查看该提交 →

18 中 HTTP socket 复用基础 socket 的超时实现 THttpClientSocket 移除重复的超时字段和 setter,改用继承自 TCrtSocket 的超时存储。等待 header 使用 ReceiveTimeout,连接与 TLS 建立使用 ConnectTimeout。 内部重构 mormot.net.client 9a5f322d+47-74

net: THttpClientSocket can directly use the new TCrtSocket timeouts

影响

现有 HTTP 客户端保持相同类接口,但超时读写现在统一使用基础实现。调整超时的应用应测试连接与响应 header 等待。

值得一看

Arnaud Bouchez · 16:38 UTC · 在 GitHub 上查看该提交 →

19 低 隧道发送前再次检查 transmit callback TTunnelLocal.SendFrame 现在在调用 callback 前要求 Assigned(fTransmit),关闭帧路径也同样检查。 修复 mormot.net.tunnel 2ccea1a0+6-5

net: minor hardening of TTunnelLocal.SendFrame

影响

当隧道的 transmit callback 已被清除时,不再调用 nil callback。Delphi 或 FPC 应用代码无需修改。

Arnaud Bouchez · 14:41 UTC · 在 GitHub 上查看该提交 →

20 低 跨平台 Negotiate 解析从 HTTP 服务器中提取 首个 ServerSspiAuthHeader 实现从 THttpServerSocketGeneric.Authorization 中提取 Authorization header 解析、Base64 解码、NTLM 拒绝及 SSPI/GSSAPI 响应生成。 新功能 mormot.lib.gssapi+2 9029fa16+59-2

net: new ServerSspiAuthHeader() cross-platform wrapper function

影响

这是同一期中的临时公开名称;最终 API 是 mormot.net.client 中的 KerberosServerAuthHeader。应用不应采用临时名称。

Arnaud Bouchez · 11:52 UTC · 在 GitHub 上查看该提交 →

21 低 HTTP Negotiate 授权改用共享 helper THttpServerSocketGeneric.Authorization 用共享认证 header helper 替换内联 SSPI/GSSAPI 解析,并集中处理 SspiKeyTab 访问器。 内部重构 mormot.net.server 71011fb6+11-48

net: simplified THttpServerSocketGeneric.Authorization NEGOTIATE support

影响

内置 HTTP Negotiate 行为得到统一,应用代码无需修改。Windows 与 POSIX 使用相同的单轮决策路径。

Arnaud Bouchez · 11:55 UTC · 在 GitHub 上查看该提交 →

22 低 异步连接 flag 现在准确描述注册状态 内部 TPollAsyncConnectionFlags 值 fInList 重命名为 fRegistered,所有注册、移除和回收检查都改用新名称。 内部重构 mormot.net.async c7708e55+14-13

net: renamed misleading TPollAsyncConnectionFlags fInList item

影响

公开 API 与运行时行为均不变。该重命名使 Delphi 与 FPC 源码 build 中的连接所有权检查更易审计。

Arnaud Bouchez · 09:27 UTC · 在 GitHub 上查看该提交 →

23 低 共享的按 byte 索引 cardinal 表替换局部别名 mormot.core.base 公开 TByteToCardinal,格式化、Unicode、安全、密码学与 HTTP 相关例程统一复用它。PurgeHeaders 读取 header 长度前也改为检查 P,而非陈旧的 h 指针。 内部重构 mormot.core.base+6 066e5953+13-12

core: new TByteToCardinal type definition

影响

除 PurgeHeaders 的小型保护修正外,应用行为不变。需要 256 项 cardinal 查找表的 Delphi 与 FPC 调用者可使用该共享类型。

公开 API

  • TByteToCardinaladded

Arnaud Bouchez · 09:32 UTC · 在 GitHub 上查看该提交 →

24 低 异步关闭测试覆盖空闲、部分与待处理流量 test.net.proto 扩展异步测试,覆盖空闲 socket、部分 header/body、大写入、慢客户端及禁用连接跟踪。TPollSockets.Pending 公开用于断言,TPollAsyncSockets.PollWrite 修正为读取访问器。 测试 mormot.net.async+2 a84c77d1+179-111

test: enhanced async process coverage

影响

测试本身不改变生产行为。此前无法读取 PollWrite 的代码现在可在非 IOCP build 上检查它。

公开 API

  • TPollSockets.Pendingadded
  • TPollAsyncSockets.PollWritebehaviour-changed — 其访问器由 write fWrite 改为 read fWrite。

Arnaud Bouchez · 12:58 UTC · 在 GitHub 上查看该提交 →

25 低 Issue 633 的关闭场景加入回归测试 test.net.proto 加入已报告的异步 HTTP 关闭模式,并验证释放服务器实例时空闲、慢速及待处理客户端都会关闭。 测试 test.net.proto 02bd02a7+96-2

test: include regression code from #633

影响

生产单元与公开 API 不变。该测试在 Delphi 与 FPC 测试运行中保护前述连接泄漏修复。

Arnaud Bouchez · 09:19 UTC · PR #633 · 在 GitHub 上查看该提交 →

上游活动 每日提交数 · 最近 60 天
提交977
活跃天数44/60
最忙一天2026-09-30
峰值60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13