mORMot2 DailyЕжедневный обзор коммитов апстрима

Deadlock в WebSocket устранён, TLS и логирование исключений стабилизированы

Async WebSocket broadcast и RTSP forwarding больше не отправляют данные под connection read lock, устраняя deadlock при удалении peer после failed write. SChannel трактует корректное закрытие во время отправки как closed connection и завершает поддержку TLS 1.3 renegotiation. Исправлен перехват исключений между потоками, в Delphi Win32 и Delphi POSIX, а AVX-512 detection теперь проверяет сохранение ZMM state операционной системой.

Коротко

  • Переходите на build 2.4.17324 в 05e40cd692d391efb62ed97f78f264867477e8e5.
  • TWebSocketAsyncServer.WebSocketBroadcast и TPostConnection.OnRead больше не deadlock при удалении соединения после failed send.
  • SChannel send возвращает nrClosed при корректном shutdown, а receive path обрабатывает TLS 1.3 SEC_I_RENEGOTIATE.
  • Concurrent exceptions больше не теряются, дубли Delphi Win32 подавлены, Delphi POSIX получил interception.
  • IntelAvx512 стал вычисляемой при запуске переменной с фильтром XCR0; cpuAVX512 обозначает включённый OS уровень x86-64-v4.
  • Windows http.sys WebSocket regression test для issue #418 отключён из-за нестабильности на Windows 11.

Рекомендации по обновлению

Переходите на build 2.4.17324. Срочно обновитесь при использовании TWebSocketAsyncServer.WebSocketBroadcast, RTSP-over-HTTP forwarding, Windows SChannel, TTunnelLocal или при зависимости от полных exception logs под нагрузкой. Проверьте broadcast при reset clients, TLS 1.3 key update, peer shutdown и ClosePort во время WaitForHandshake. superseded_by отсутствует, поэтому формальный avoid range не заявляется; берите серии целиком. Отдельно следите за issue #418: Windows http.sys WebSocket test отключён.

Сборка2.4.17293 → 2.4.17324
Коммиты30
Строки+992 -386
Чтение5 мин

27 из 27 записей · 30 коммитов в апстриме

Сюжеты
# Запись Категория Модули
1 Высокий WebSocket broadcast использует безопасные snapshots для обоих timeout modes GetConnectionHandles/GetConnectionInstances обходят реальный массив class references. WebSocketBroadcast использует instance snapshots только при timeout 0, handles для blocking send и проверяет ConnectionFind на nil. Исправления mormot.net.async+1 f253c603+53-40

net: properly fixed #629

Влияние

Broadcast к конкурентно закрывающимся peers больше не рискует deadlock или nil dereference, а non-blocking path избегает повторных searches.

Публичный API

  • TWebSocketAsyncServer.WebSocketBroadcastbehaviour-changed

Arnaud Bouchez · 14:12 UTC · PR #629 · открыть коммит на GitHub →

2 Высокий SChannel продолжает handshake при TLS 1.3 key update TSChannelNetTls.Receive распознаёт SEC_I_RENEGOTIATE и передаёт остаток input в HandshakeStep. Test client может запросить SSL_key_update в середине передачи; добавлен TBuffer32K. Исправления mormot.core.base+3 8e6133ef+56-26

net: SChannel fixes and new tests about TLS 1.3 renegotiation

Влияние

Долгоживущие SChannel TLS 1.3 connections переживают peer key update вместо сбоя после SEC_I_RENEGOTIATE.

Публичный API

  • TBuffer32Kadded

Arnaud Bouchez · 16:27 UTC · открыть коммит на GitHub →

3 Высокий Закрытие SChannel socket сообщается без shutdown exceptions NetErrorFromSystem переводит WSAENOTCONN и WSAESHUTDOWN в nrClosed. TSChannelNetTls.SendRawAll возвращает TNetResult, callers останавливаются при закрытии, receive errors включают нормализованный результат. Исправления mormot.net.sock+1 2d800eaa+46-26

net: several fixes to SChannel socket closure

Влияние

Нормальный Windows TLS teardown больше не выглядит как fatal ESChannel, включая отправку handshake tokens и encrypted output.

Публичный API

  • NetErrorFromSystembehaviour-changed

Arnaud Bouchez · 17:01 UTC · открыть коммит на GitHub →

4 Высокий WebSocket broadcast освобождает connection read lock до записи WebSocketBroadcast копирует destination handles под ConnectionLock.ReadOnlyLock, освобождает его, затем кодирует и отправляет через ConnectionFind. Документация предупреждает, что Write может вызвать ConnectionDelete и не должен выполняться под read lock. Исправления mormot.net.async+1 fd8b176f+25-15

net: fixed TWebSocketAsyncServer.WebSocketBroadcast deadlock when a send fails

Влияние

Failed broadcast send может удалить connection без upgrade read lock и deadlock async server. Поздние commits завершают nil/lifetime handling.

je · 09:21 UTC · открыть коммит на GitHub →

5 Высокий Concurrent exceptions больше не исчезают из TSynLog Exception handlers больше не очищают global _RawLogException при каждом log. Recursion подавляется per-thread через PerThreadInfo.ExceptionIgnore, поэтому handler других потоков остаётся активным. Исправления mormot.core.os+1 6b486e00+18-17

core: fixed Exception diseappearing in logs on multi-thread process :(

Влияние

Исключения, одновременно поднятые в разных потоках, больше не пропускаются. Затронуты concurrent Delphi/FPC services.

Arnaud Bouchez · 10:05 UTC · открыть коммит на GitHub →

6 Высокий WebSocket clients и local tunnels безопасно публикуют shutdown state TTunnelLocal.ClosePort ставит fClosed под fSendSafe, THttpClientWebSockets.Destroy использует FreeAndNilSafe, а callback requests берут fProtocol.ConnectionFlags напрямую. Исправления mormot.net.tunnel+1 b60779e1+5-5

net: hardened THttpClientWebSockets shutdown

Влияние

Tunnel senders и WaitForHandshake observers видят closure в согласованном порядке, а уничтожение WebSocket client безопаснее при concurrent callbacks.

Arnaud Bouchez · 08:56 UTC · открыть коммит на GitHub →

7 Высокий Корректное закрытие SChannel при send теперь возвращает nrClosed TSChannelNetTls.SendRawAll задаёт nrClosed до обработки zero-byte send, поэтому корректный peer shutdown завершает вызов без ESChannel. Исправления mormot.net.sock.windows 1a03af2e+5-4

net: fixed graceful disconnection during SChannel sending

Влияние

Windows TLS clients и servers могут закрываться во время pending send без превращения normal shutdown в exception.

Arnaud Bouchez · 17:52 UTC · открыть коммит на GitHub →

8 Высокий RTSP-over-HTTP forwarding больше не пишет под ConnectionLock TPostConnection.OnRead заменяет ConnectionFindAndLock(cReadOnly) на ConnectionFind перед WriteString, поскольку failed write может вызвать ConnectionDelete и запросить тот же lock в write mode. Исправления mormot.net.rtsphttp a1c8844a+3-4

net: fixed TPostConnection.OnRead holding ConnectionLock during WriteString()

Влияние

RTSP-over-HTTP POST forwarding больше не deadlock, если связанное RTSP connection исчезает во время write.

je · 09:21 UTC · открыть коммит на GitHub →

9 Средний Современный Delphi использует один exception hook без дублей SynRaiseProc обобщён для RaiseExceptObjProc; Windows vectored/unwind handlers пропускают уже обработанные Delphi exceptions, фильтруют fake RTL codes и сохраняют цепочку original handlers. Исправления mormot.core.os b6de95bf+56-40

core: refined Delphi exception logging

Влияние

Delphi exceptions логируются один раз при сохранении RTL и third-party hooks. Routing Windows/POSIX стал согласованнее.

Модули

Arnaud Bouchez · 12:08 UTC · открыть коммит на GitHub →

10 Средний Исключения Delphi Win32 больше не логируются дважды Delphi 2009+ Win32 устанавливает RaiseExceptObjProc для language exceptions, а RTLUnwindProc пропускает уже обработанные cRtlException records. Исправления mormot.core.os 0a512f58+51-23

core: fixed duplicate Exception logging on Delphi Win32

Влияние

TSynLog больше не пишет дубли для обычных Delphi Win32 exceptions; старые Delphi и FPC сохраняют свои hooks.

Модули

Arnaud Bouchez · 09:24 UTC · открыть коммит на GitHub →

11 Средний Exception logs допускают неизвестный instruction address SynLogException не выводит поле 'at', если TSynLogExceptionContext.EAddr равен нулю, и использует безопасные writer calls перед доступными stack frames. Исправления mormot.core.log 128e7134+11-6

core: fixed SynLogException() with Ctxt.EAddr = 0

Влияние

Delphi LLVM exception records без надёжного адреса остаются корректными и сохраняют доступный stack trace.

Модули

Arnaud Bouchez · 12:06 UTC · открыть коммит на GitHub →

12 Средний Default RSA generation timeout масштабируется с размером ключа TRsa.Generate умножает RSA_DEFAULT_GENERATION_TIMEOUTMS на 4 для 3072-bit, на 16 для 4096-bit и на 64 для 7680/8192-bit keys, сохраняя explicit custom timeouts. Исправления mormot.crypt.rsa ad2f17e3+10-3

crypt: RSA generation timeout auto adaptation

Влияние

Слабые CPU реже возвращают rgrTimeout при generation больших RSA keys с defaults. Явный TimeOutMS не меняется.

Стоит взглянуть

Проверьте latency budgets для 3072-bit+ generation; задайте TimeOutMS явно, если более долгий default не подходит.

Публичный API

  • TRsa.Generatebehaviour-changed

Модули

Arnaud Bouchez · 06:41 UTC · открыть коммит на GitHub →

13 Средний TTunnelLocal отмечает closure до пробуждения handshake waiters TTunnelLocal.ClosePort и remote-close path ставят fClosed до сигнала fHandshakeEvent, чтобы WaitForHandshake не увидел прежнее open state. Исправления mormot.net.tunnel e7c2a1fb+6-6

net: hardened TTunnelLocal.ClosePort

Влияние

Handshake waiters получают согласованный closed state. Следующий commit переносит assignment внутрь send lock для полной синхронизации.

Модули

Arnaud Bouchez · 08:49 UTC · открыть коммит на GitHub →

14 Средний Async connection owners могут получать snapshot живых handles или instances TAsyncConnections добавляет public methods GetConnectionHandles/GetConnectionInstances, копирующие незакрытые соединения под ConnectionLock.ReadOnlyLock. Новые возможности mormot.net.async 40766691+61-2

net: new TAsyncConnections.GetConnectionInstances/GetConnectionHandles methods

Влияние

Custom async code получает более безопасные snapshot APIs. Instances защищены от recycling только на KeepConnectionInstanceMS и не подходят для blocking work.

Стоит взглянуть

Для delayed/blocking work используйте handles; instance snapshots — только для немедленных non-blocking операций.

Публичный API

  • TAsyncConnections.GetConnectionHandlesadded
  • TAsyncConnections.GetConnectionInstancesadded

Модули

Arnaud Bouchez · 13:50 UTC · открыть коммит на GitHub →

15 Средний AVX-512 detection проверяет управляемое OS состояние ZMM mormot.core.base добавляет asm IsZmmOSEnabled, AVX-512 feature-set constants, фильтрацию IntelAvx512 через XCR0 и cpuAVX512 в TX64CpuFeatures для x86-64-v4. Новые возможности mormot.core.base+1 6941a143+56-2

core: introducing IntelAvx512 to detect AVX-512 support enabled by the OS

Влияние

CPU dispatch может не использовать AVX-512, если CPUID его сообщает, но старый OS/VM не сохраняет opmask/ZMM, предотвращая #UD faults.

Стоит взглянуть

Перед custom EVEX dispatch используйте IntelAvx512 или cpuAVX512 вместо raw CpuFeatures, особенно в VM.

Публичный API

  • CPUAVX512FEATURESadded
  • CPUAVX512X64V4added
  • IntelAvx512added
  • cpuAVX512added

Dimitris Kounalakis · 04:03 UTC · открыть коммит на GitHub →

16 Средний OpenSSL wrapper предоставляет TLS 1.3 key update mormot.lib.openssl11 добавляет SSL_KEY_UPDATE_NOT_REQUESTED, SSL_KEY_UPDATE_REQUESTED и optional SSL_key_update в dynamic/static bindings. Новые возможности mormot.lib.openssl11 8f4fd5a1+28-14

lib: new SSL_key_update() OpenSSL function wrapper

Влияние

Низкоуровневые OpenSSL users могут запросить TLS 1.3 traffic-key rotation. Старые библиотеки продолжают загружаться, поскольку symbol optional.

Публичный API

  • SSL_key_updateadded
  • SSL_KEY_UPDATE_NOT_REQUESTEDadded
  • SSL_KEY_UPDATE_REQUESTEDadded

Arnaud Bouchez · 15:09 UTC · открыть коммит на GitHub →

17 Средний Delphi POSIX получил предварительное автоматическое логирование исключений mormot.defines.inc включает interception на Delphi POSIX, а mormot.core.os.posix выбирает RaiseExceptObjProc вместо FPC RaiseProc hook. Новые возможности mormot.core.os+1 e2798199+11-6

core: preliminary exception logging on Delphi POSIX

Влияние

Delphi Linux и mobile POSIX builds могут автоматически писать TSynLog exception records там, где interceptor отсутствовал. FPC не меняется.

Стоит взглянуть

Перед production проверьте объём logs и формат exception stack на каждом Delphi POSIX target.

Публичный API

  • RawExceptionInterceptbehaviour-changed

Arnaud Bouchez · 12:16 UTC · открыть коммит на GitHub →

18 Низкий Доступность AVX-512 вычисляется один раз при startup CPU detection Public no-argument функция IntelAvx512 стала global TIntelCpuFeatures, заполняемым TestCpuFeatures, что убирает повторные XGETBV при сохранении XCR0 filter. Производительность mormot.core.base fb734823+14-18

core: IntelAvx512 is now a global variable pre-computed at startup

Влияние

Feature check стал чтением variable. Обычные Pascal expressions остаются естественными, но код, берущий адрес функции, должен измениться.

Стоит взглянуть

Ищите только low-level code, сохраняющий или передающий function pointer IntelAvx512; обычные value checks не требуют migration.

Публичный API

  • IntelAvx512signature-changed — Функция этого же выпуска финализирована как precomputed global variable.

Модули

Dimitris Kounalakis · 13:41 UTC · открыть коммит на GitHub →

19 Низкий Delphi exception interception включается по реальной доступности RTL POSIX include задаёт WITH_RAISEEXCEPTOBJPROC только при HASRAISEEXCEPTOBJPROC; остальные изменения уточняют stack filtering и comments. Компилятор и платформы mormot.core.log+3 3327833c+17-15

core: some minor fixes

Влияние

Старые Delphi targets не компилируются с недоступным interception hook. Поведение FPC и modern Delphi не меняется.

Arnaud Bouchez · 13:00 UTC · открыть коммит на GitHub →

20 Низкий mTLS tests передают большие request bodies через множество TLS records test.net.proto добавляет large POST route, chunked client sends, CRC32C verification и TLS 1.2/1.3 cases для SChannel/OpenSSL servers. Тесты test.net.proto 9a5d0e77+105-28

test: cover huge content with mTLS

Влияние

Regression coverage охватывает границы records и большие mTLS payloads; application API не меняется.

Модули

Arnaud Bouchez · 15:48 UTC · открыть коммит на GitHub →

21 Низкий Regression test с reset peer воспроизводит WebSocket broadcast deadlock TNetworkProtocols добавляет server, broadcast worker и 50 short-lived clients, закрывающихся с unread frames и RST; невозможность принять следующий client выявляет wedged server. Тесты test.net.proto c0f6defb+83-0

test: new TNetworkProtocols._TWebSocketAsyncServer regression test

Влияние

Тест покрывает issue #629 без изменения production behavior.

Модули

je · 09:21 UTC · открыть коммит на GitHub →

22 Низкий mTLS test workers надёжно ловят и классифицируют network exceptions SChannel/OpenSSL test runner оборачивает worker execution, логирует класс exception, принимает ENetSock как ожидаемый network failure и задаёт каждому async server отдельное имя. Тесты mormot.core.log+1 cc95a9eb+28-14

test: hardened error catching for SChannel/OpenSSL mTLS

Влияние

TLS regression failures легче диагностировать без изменения application runtime behavior.

Arnaud Bouchez · 08:08 UTC · открыть коммит на GitHub →

23 Низкий WebSocket deadlock regression включён в multithread suite Regression issue #629 перенесена в SlowTests, использует TLoggedThread и запускается с другими background network tests при /multithread. Тесты test.net.proto bb3be0ae+23-16

tests: fixed #629 coverage

Влияние

Меняются только test scheduling и diagnostics; production code не затронут.

Модули

Arnaud Bouchez · 14:13 UTC · PR #629 · открыть коммит на GitHub →

24 Низкий WebSocket broadcast stress test запускается после первого клиента Regression thread стартует после первого успешного client connection, чередует send с 0 и 50 ms, хранит локальный счётчик и не разыменовывает его при wedged shutdown. Тесты test.net.proto 9a417d31+21-15

test: fixed WS broadcast thread synchronization

Влияние

Меняется только regression harness; production code и API Delphi/FPC не затронуты.

Модули

Arnaud Bouchez · 17:52 UTC · открыть коммит на GitHub →

25 Низкий Broadcast regression чередует blocking и non-blocking send WebSocket regression test выносит sent counter из worker и чередует aTimeOut 0/50 ms при повторных connect/reset clients. Тесты test.net.proto 0eadadb7+22-7

test: enhanced WS broadcast process

Влияние

Coverage проверяет оба connection-snapshot path WebSocketBroadcast; application behavior не меняется.

Модули

Arnaud Bouchez · 17:13 UTC · открыть коммит на GitHub →

26 Низкий Windows http.sys WebSocket regression test временно отключён TNetworkProtocols._HttpApiWebSocketServer теперь сразу выходит, отключая покрытие issue #418 из-за нестабильности теста, особенно на Windows 11. Тесты test.net.proto 05e40cd6+3-2

tests: disable issue #418 coverage

Влияние

Application behavior не меняется, но CI больше не обнаруживает regressions в этом Windows http.sys WebSocket scenario.

Модули

Arnaud Bouchez · 18:10 UTC · PR #418 · открыть коммит на GitHub →

27 Низкий Комментарии LDAP и WebSocket уточнены без runtime changes Исправлены комментарии около CldapBroadcast, AVX-512 globals и сортировки WebSocket IDs; executable statements не меняются. Документация mormot.core.base+2 d3366efd+6-6

net: minor fixes

Влияние

Нет влияния на Delphi/FPC application code или runtime behavior.

Arnaud Bouchez · 15:09 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