立即处理可能影响正在运行的系统原始 payload 含 24 个 non-merge commit 与 10 个 merge commit;所有 non-merge commit 均已覆盖。没有 superseded_by 标记。避开区间依据本 payload 中对相同 routine 的直接后续修复。版本记录文件已忽略。
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。
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 签发的有效证书。
建议升级
升级 OpenSSL client 并测试 DNS name 与字面 IP endpoint;若证书 identity 与 ServerAddress 不同,请显式设置 HostNamesCsv。
公开 API
TOpenSslNetTls.AfterConnectionbehaviour-changed — HostNamesCsv 为空现在表示验证 ServerAddress,而非跳过 hostname 验证。
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 需要相反网络方向时不再立即失败。
建议升级
升级到 2.4.17064 或更高并测试双向 TLS 负载;不要在缺少后续错误队列修复时单独部署此重试。
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 分类与误导诊断。
建议升级
OpenSSL 1.1/3.x 用户应采用 build 2.4.17064 或更高,并复测异步 connect、accept、read、write 失败路径。
公开 API
ERR_clear_erroradded — libcrypto 错误队列重置函数现通过动态与静态 OpenSSL binding 公开。
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 移除该路径。
建议升级
不要发布 build 2.4.17047;任何可达 FormatAdder 的场景都应使用 2.4.17048 或更高。
公开 API
FormatAdderbehaviour-changed — 格式化结果为零字节时不再分配目标或写入。
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 路径由条件编译隔离。
建议升级
发布 Delphi ARMv7 的团队应重建,并在真实 32-bit Android 设备运行 interface、variant 与 packed-record JSON 测试。
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 行。
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。
建议升级
若已包含 TSynLog 预渲染序列,请采用 build 2.4.17046 或更高。
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 输出。
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 之后。
建议升级
若 TXmlParser Save/Restore 处理含 DOCTYPE 的文档,请使用 build 2.4.17062 或更高。
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 实现。
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 声明的旧行为。
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。
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。
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。
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 解析保持不变。
建议升级
遇到 Mach 链接错误的 Delphi Darwin 项目应使用此 revision 或更高版本重建。
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 的无界尾部;诊断保持紧凑单行。
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 在后续清理时保持内部一致。
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 现在追加缓存一秒的文本快照,而非每次调用都重新格式化。
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 或输出变化,但它开启了后续修复完成的日志序列。
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。
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 外无预期公开行为变化;接受与拒绝形式仍由测试覆盖。
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 证据。
23
低
statement 失败测试改用静默 exception class
#606 外部数据库测试改为抛出并期待 ESynLogSilent,而非 ESqlDBException,以免 IDE 运行显示预期失败噪声。
测试
00a2da4f+4-4
tests: simplified #606 test when run in IDE
影响
仅测试体验变化;应用数据库异常行为不受影响。
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 序列化行为不受影响。