mORMot2 Daily每日上游提交速读

TLS 验证、格式化安全与 Delphi 移动网络支持同时落地

OpenSSL 用户应完整采用本次 transport 序列:跨方向 socket 重试、默认 hostname 验证,以及 OpenSSL 1.x/3.x 的错误队列清理。FormatAdder 曾在一个 build 中于空输出时可能通过无效目标写入。Delphi Android/iOS 新增 System.Net HTTP backend,Delphi ARMv7 可用,TXmlParser 也开始接受简单 DOCTYPE,但不会加载 DTD entity。

要点

  • 应采用 build 2.4.17065 的 743a53fd4cb3af700463b0d143581ce17c6c8b31。
  • HostNamesCsv 为空时,OpenSSL client 现在验证 ServerAddress;OpenSSL 1.x/3.x 在 connect、accept、read、write 前清理旧错误。
  • 避开 2.4.17025–2.4.17063 的不完整 OpenSSL 重试序列,以及存在 FormatAdder 空输出 overflow 路径的 2.4.17047。
  • Delphi Android/iOS 可通过 OS TLS 使用 TDelphiNetHttp、TRestHttpClientDelphiNet 与 TSqlDBDelphiNetConnectionProperties。
  • Delphi Android ARMv7 新增 ABI stub、packed field 对齐 JSON 处理和 variadic-call 支持。
  • TXmlParser 默认忽略简单外部 DOCTYPE;如需严格拒绝请使用 xpoRejectDocType,internal subset 仍不支持。

升级建议

请采用 build 2.4.17065。OpenSSL 部署应在 OpenSSL 1.1/3.x 下测试 HostNamesCsv 为空时的 DNS/IP 连接、证书拒绝,以及 SSL_read/SSL_write 的 WANT 转换。检查直接调用 UniqueRawUtf8ZeroToTilde 的代码:它现在返回 PUtf8Char,并替换所有低于 #32 的控制字节,而非仅 #0。严格 XML 消费方应加入 xpoRejectDocType。Delphi mobile 团队应在各目标测试 System.Net redirect、压缩、proxy 与证书 callback。

版本号2.4.17024 → 2.4.17065
提交34
行数+2648 -805
阅读3 分钟

24 条中的 24 条 · 上游 34 次提交

主题
# 条目 类别 单元
1 严重 未提供 hostname 列表时 OpenSSL client 验证 ServerAddress Context.HostNamesCsv 为空时,TOpenSslNetTls.AfterConnection 现在把 ServerAddress 传给 SSL_set1_host。显式 CSV name 仍以第一个调用 SSL_set1_host,后续调用 SSL_add1_host;partial wildcard 仍禁用。 安全 mormot.lib.openssl11 c2012a28+8-9

lib: fixed TOpenSslNetTls.AfterConnection hostname verification

影响

此前启用证书检查但未设置 HostNamesCsv 的默认 OpenSSL client 只验证证书链,却未配置预期 peer hostname;现在会拒绝为其他 host 签发的有效证书。

公开 API

  • TOpenSslNetTls.AfterConnectionbehaviour-changed — HostNamesCsv 为空现在表示验证 ServerAddress,而非跳过 hostname 验证。

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

2 高 OpenSSL 读写会重试相反 socket 方向 SSL_read 返回 SSL_ERROR_WANT_WRITE 时 TOpenSslNetTls.Receive 会等待;SSL_write 返回 SSL_ERROR_WANT_READ 时 Send 会等待。WaitRetry 每 100 ms 等待所需 TNetEvents,五秒后超时。 修复 mormot.lib.openssl11 c52d3378+55-28

lib: fixed TOpenSslNetTls.Receive/Send socket level retry

影响

异步 socket 上的 renegotiation 与 TLS 状态转换在 OpenSSL 需要相反网络方向时不再立即失败。

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

3 高 OpenSSL 1.x/3.x 重试从空错误队列开始 动态与静态 libcrypto surface 新增 ERR_clear_error。CheckProc、Receive、Send 在 SSL_connect、SSL_accept、SSL_read、SSL_write 前立即调用它,满足 OpenSSL 3.x 及之前要求。 修复 mormot.lib.openssl11+1 b999062f+24-12

lib: fixed TOpenSslNetTls error reset for OpenSSL < 4.x

影响

旧的 per-thread OpenSSL error 不再污染重试 handshake 或 I/O 结果,避免 OpenSSL 1.1/3.x 上的错误 fatal 分类与误导诊断。

公开 API

  • ERR_clear_erroradded — libcrypto 错误队列重置函数现通过动态与静态 OpenSSL binding 公开。

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

4 高 FormatAdder 不再通过空 formatter 状态写入 FormatAdder 仅在 TFormatUtf8.size 非零时调用 Dest.Add 与 WriteAll。空 format 或 argument 不再以未初始化 block 进入 WriteAll。 修复 mormot.core.text 57b8cb89+5-4

core: fixed FormatAdder() potential buffer overflow

影响

这一 build 的回归可能读取未初始化 formatter entry,并通过零字节 append 返回的目标复制,造成 buffer overrun 或 crash;新增 guard 移除该路径。

公开 API

  • FormatAdderbehaviour-changed — 格式化结果为零字节时不再分配目标或写入。

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

5 高 Delphi Android ARMv7 获得可用 interface call 与 packed JSON 编译后的 ARM object 为 Delphi LLVM 提供 armfakestub、armcallmethod 与 128 个 VMT thunk。ABI 将 by-reference result 放入 R0、Self 放入 R1;JSON 通过对齐副本处理未对齐 packed float/Int64,DispInvoke 遵循 AAPCS32 va_list 对齐。 编译器与平台 mormot.core.interfaces+4 7cda59c1+348-33

all: make the Delphi Android 32-bit (ARMv7) target work

影响

Delphi 32-bit Android 可执行基于 interface 的 SOA/mock 调用,序列化 packed 数值 field 时避免 ARM alignment fault,并正确传递 64-bit variadic 值。Delphi/FPC desktop 路径由条件编译隔离。

Stefan Diestelmann · 09:21 UTC · 在 GitHub 上查看该提交 →

6 中 TSynLog stack trace 从应用 caller 开始 LockAndPrepareWrite 接受 skip count 并传给 AppendCallerShort。格式化、文本与 RTTI wrapper 跳过自身 frame,直接 Log/Enter 保持预期 depth;格式化 Enter overload 也不再重定向到 EnterLocal。 修复 mormot.core.log e0a83a37+32-19

core: fixed TSynLog stack trace

影响

LevelStackTrace 输出指向应用调用点,而非 TSynLog wrapper 内部,从而改进生产日志源码定位。

值得一看

若工具解析精确 stack position,请升级到 2.4.17046 或更高后比较代表性 LevelStackTrace 行。

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

7 中 TSynLog header 在持有锁时统一准备 LockAndPrepareWrite/LockAndPrepareEnter 现在接收 instance,并在获取 writer lock 后调用 LogHeader。所有路径移除重复调用,UnicodeString Log overload 传递 aInstance,而非错误的 Instance 标识符。 修复 mormot.core.log efb51396+19-25

core: some TSynLog fixes and optimization

影响

raw、text、RTTI 与 Enter 调用的 log header 和对象归属保持一致;UnicodeString 日志不再可能关联错误 instance。

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

8 中 SQL 参数日志达到大小限制后仍保留 placeholder TSqlDBStatement.ComputeSqlWithInlinedParams 将 maxAllowed 修正为 maxSize-W.TextLength。值预算耗尽后,后续参数写为 '?' 并继续处理完整 SQL;getter 也容忍 self=nil,异常日志直接检查 SQL level。 修复 mormot.db.sql d080dbe2+22-17

db: fixed TSqlDBStatement logging process

影响

有界诊断 SQL 不再发生剩余长度 underflow,也不会丢失语句尾部,因此失败日志保留结构且不暴露过大值。

值得一看

若运维依赖 SQL 失败日志,请在升级后比较 LoggedSqlMaxSize 输出。

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

9 中 XML Save/Restore 保留 DOCTYPE 是否仍合法的状态 TXmlParser.Save 将 fStackLen[0] 存入保存 QWord 的空闲 byte,Restore 再写回,从而与 Kind、Depth、cursor position 一起保留 prolog/root 状态。 修复 mormot.core.fmt adb58c1a+26-6

core: DOCTYPE should be properly supported after Save/Restore

影响

围绕 prolog DOCTYPE 的 speculative parsing 可恢复并重放,不会误判声明位于 document element 之后。

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

10 中 TDelphiNetHttp 内嵌 Delphi System.Net transport TDelphiNetHttp 现在在 mormot.net.client 中直接持有 THTTPClient,临时 mormot.lib.nethttp unit 被移除。它映射 timeout、proxy、header、认证、redirect、stream、响应与证书 callback,并避免 iOS 对 gzip/deflate 二次解压。 新功能 mormot.defines+1 4964dc05+139-252

net: TDelphiNetHttp as a single class, no new unit

影响

Delphi Android/iOS 可通过平台 TLS 发起 HTTP/HTTPS,无需携带 libcurl/OpenSSL;该 class 不实现上传/下载进度事件。

值得一看

Delphi mobile 项目应在每个部署 OS 版本测试 proxy、redirect、压缩响应与证书错误行为。

公开 API

  • TDelphiNetHttpadded — 定义 USEDELPHINETHTTP 时可使用基于 Delphi System.Net.HttpClient 的公开 THttpRequest 实现。

Stefan Diestelmann · 08:51 UTC · 在 GitHub 上查看该提交 →

11 中 TXmlParser 默认接受简单 DOCTYPE 声明 TXmlParser 识别 prolog 中的 <!DOCTYPE name ...>,并在尊重 quote 的情况下跳到闭合 '>'。root 后声明、internal subset、嵌套 '<' markup 与自定义 entity 仍被拒绝;xpoRejectDocType 可恢复全部拒绝。 新功能 mormot.core.fmt 22056546+128-11

core: TXmlParser ignore simple DOCTYPE by default

影响

含外部 SYSTEM/PUBLIC 声明的 SVG/XML 可在不加载 DTD 的情况下解析。此前依赖 xpeUnsupportedMarkup 的严格调用方必须启用 xpoRejectDocType。

值得一看

若策略要求拒绝所有 DOCTYPE,而非安全忽略简单声明,请加入 xpoRejectDocType。

公开 API

  • xpoRejectDocTypeadded — 新的 TXmlParserOption 强制恢复拒绝所有 DOCTYPE 声明的旧行为。

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

12 中 支持的移动目标默认使用 Delphi System.Net 处理 REST HTTPS TRestHttpClientDelphiNet 将 TRestHttpClientRequest 映射到 TDelphiNetHttp。没有 USELIBCURL 且定义 USEDELPHINETHTTP 时,TRestHttpsClient alias 改用新 class,而非 socket client。 新功能 mormot.rest.http.client ad2fbdba+43-8

rest: HTTP/HTTPS RESTful JSON default mORMot Client class with Delphi System.Net

影响

Delphi Android/iOS 上现有 TRestHttpsClient 源码无需改 class 名即可通过 OS TLS 获得 HTTPS 支持。

值得一看

确认 mobile build 将 TRestHttpsClient 解析为预期 backend,并测试认证与证书策略。

公开 API

  • TRestHttpClientDelphiNetadded — 新增条件可用、基于 Delphi System.Net.HttpClient 的公开 REST client class。
  • TRestHttpsClientbehaviour-changed — 定义 USEDELPHINETHTTP 且未定义 USELIBCURL 时,该 alias 现在选择 TRestHttpClientDelphiNet。

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

13 中 远程 SQL proxy 新增 Delphi System.Net backend mormot.db.proxy 在 USEDELPHINETHTTP 下新增 TSqlDBDelphiNetConnectionProperties;constructor 创建 TDelphiNetHttp,并注册 class 以支持 definition-based construction。 新功能 mormot.db.proxy+1 d9d710d1+39-5

db: introducing TSqlDBDelphiNetConnectionProperties

影响

Delphi mobile client 可通过 OS 网络栈以 HTTP/HTTPS 访问远程 mormot.db.sql service。

值得一看

选择此 backend 的项目应在目标 mobile OS 上运行认证与远程 statement 测试。

公开 API

  • TSqlDBDelphiNetConnectionPropertiesadded — 定义 USEDELPHINETHTTP 时可使用基于 TDelphiNetHttp 的公开 HTTP SQL-proxy connection class。

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

14 中 UniqueRawUtf8ZeroToTilde 现在返回有界净化文本 UniqueRawUtf8ZeroToTilde 从 procedure 改为返回 PUtf8Char 的 function。返回 view 在 MaxSize 处终止,并将所有低于 #32 的 byte 替换为 '~',不再只替换嵌入 #0。 新功能 mormot.core.unicode 1f32a7e3+15-12

core: refined UniqueRawUtf8ZeroToTilde()

影响

调用方可追加有界 C-string,而不改变 RawUtf8 managed length。日志也会扁平化 tab、换行及其他控制字符,因此精确文本会变化。

值得一看

若代码依赖保留控制字符或旧 procedure 声明,请搜索直接调用 UniqueRawUtf8ZeroToTilde 的位置。

公开 API

  • UniqueRawUtf8ZeroToTildesignature-changed — 该 routine 现在返回 PUtf8Char,净化所有低于 #32 的控制 byte,同时保留 RawUtf8 allocation length。

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

15 中 Delphi Darwin 从 clib 链接 Mach process API host_processor_info、mach_host_self、vm_deallocate 与 mach_task_self 声明改为指定 external clib name,不再把 symbol 名当作 library file。 编译器与平台 mormot.core.os.posix 60e27c19+4-4

core: name the library for the mach externals on Darwin

影响

Delphi macOS/iOS build 不再因这些 Mach symbol 出现 file not found 链接错误;FPC 解析保持不变。

Stefan Diestelmann · 07:56 UTC · 在 GitHub 上查看该提交 →

16 低 SOA contract 错误仅显示一千字节净化 JSON TServiceFactoryClient.FakeContractRetrieve 使用 Join 与 UniqueRawUtf8ZeroToTilde 的有界 PUtf8Char view 构建无效响应消息,上限 1 KB。 修复 mormot.soa.client 9dfdcc05+4-7

soa: fixed TServiceFactoryClient error message content

影响

异常 SOA 响应不再在插入终止符后追加 managed string 的无界尾部;诊断保持紧凑单行。

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

17 低 batch rollback 日志不再修改 JSON 的 managed length TRestOrmServerBatchSend.OnError 将 UniqueRawUtf8ZeroToTilde 返回的 PUtf8Char 直接传给 warning formatter,并将显示数据限制为 SizeOf(TBuffer4K),不再向 fData 插入终止符后记录 managed string。 修复 mormot.orm.server c2393ce7+3-4

orm: fixed TRestOrmServerBatchSend.OnError logged content

影响

部分 rollback 诊断变为有界单行,同时保留的 batch buffer 在后续清理时保持内部一致。

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

18 低 AppendSysInfo 复用一秒期二进制与文本快照 RetrieveSysInfo 在 OSSafe 下从一秒 TSysInfo cache 填充可选 binary/text 输出。渲染形式缓存于 TShort95,AppendSysInfo 将其复制到调用方 ShortString 的剩余容量。 性能 mormot.core.os+2 743a53fd+52-36

core: cache AppendSysInfo() text for 1 second

影响

一秒内重复 LevelSysInfo 日志无需重建 CPU/load/memory 文本,并复用相同快照;因此数值按设计最多一秒不变。

公开 API

  • AppendSysInfobehaviour-changed — 该公开 helper 现在追加缓存一秒的文本快照,而非每次调用都重新格式化。

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

19 低 TSynLog 格式化状态集中到单个预渲染 record TPreRenderFmt 汇集 format、argument、instance、length 与 4 KB stack buffer。TSynLogFamily.PreRenderFmt 及格式化 Enter/Log 路径传递该 record,保留 direct-rendering fallback。 内部重构 mormot.core.log 723e8275+102-84

core: rewritten TSynLogFamily.PreRenderFmt logic

影响

这是内部 plumbing,无预期 API 或输出变化,但它开启了后续修复完成的日志序列。

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

20 低 TFormatUtf8 与 TSynLog wrapper 完成内部简化 TFormatUtf8 直接跟踪 last/max 并使用共享 WriteAll helper;TSynLog 以 AddPreRenderFmt 替代 LogFmt。SQLite 日志注释记录 4 KB 预渲染上限。无预期功能变化。 内部重构 mormot.core.log+2 b47efdb5+78-72

core: some refactoring with no functional change

影响

重构本身为内部变化,但其 FormatAdder 零输出边界问题由下一 non-merge commit 立即修复;不要停留在 2.4.17047。

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

21 低 DOCTYPE 扫描简化,但未扩大可接受 markup ParseDocType 集中 root state、option、name 与边界检查,再以单循环扫描 quote 和禁止 markup;测试新增 DOCTYPE 前 comment 场景。 内部重构 mormot.core.fmt 3d2c0c85+36-49

core: simplified TXmlParser.ParseDocType for #614

影响

除前一 DOCTYPE feature 外无预期公开行为变化;接受与拒绝形式仍由测试覆盖。

Arnaud Bouchez · 15:50 UTC · PR #614 · 在 GitHub 上查看该提交 →

22 低 实时 DNS 测试输出耗时与原始响应详情 yahoo.com 连通性测试改用 DnsQuery,核对 raw/parsed header 计数,并输出耗时、大小、rcode 与 truncation。 测试 e4ebd6dc+29-13

tests: enhanced "dig yahoo.com" test with console output

影响

framework 行为不变;CI 或本地网络测试失败时会提供更有用的 DNS 证据。

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

23 低 statement 失败测试改用静默 exception class #606 外部数据库测试改为抛出并期待 ESynLogSilent,而非 ESqlDBException,以免 IDE 运行显示预期失败噪声。 测试 00a2da4f+4-4

tests: simplified #606 test when run in IDE

影响

仅测试体验变化;应用数据库异常行为不受影响。

Arnaud Bouchez · 07:51 UTC · PR #606 · 在 GitHub 上查看该提交 →

24 低 log viewer 标题显示平台信息并收紧行高 TMainLogView 在标题加入 OS_TEXT 与 CPU_ARCH_TEXT,并调整 event/list 行高计算;另含 JSON 缩进修正。 杂项 mormot.tools.logview b123f603+7-6

tools: minor TMainLogView tweaks

影响

仅 desktop log viewer 展示变化;framework 日志与 JSON 序列化行为不受影响。

Arnaud Bouchez · 14:42 UTC · 在 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