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

Проверка AES-GCM восстановлена, Tunnel и очереди переработаны

Самое срочное исправление возвращает проверку GMAC в AVX-путь расшифровки AES-GCM, который на подходящих x86-64 системах мог принимать поддельные ciphertext, tag или associated data. Жизненный цикл, handshake и shutdown Tunnel переработаны: внешние вызовы вынесены из блокировок, а владелец детерминированно управляет thread. Ожидание очередей и thread pool получает OS futex и новые API, затем обязательные исправления для Delphi, Win8+ и Linux.

Коротко

  • Переходите на build 2.4.17356 в 1f7febd219f9cb54175a1f87620e6862e4e670b8.
  • TAesGcmEngine.Decrypt теперь проверяет GMAC после AVX single-pass; тесты отклоняют поддельные ciphertext, tag и AAD.
  • TTunnelLocal владеет worker и выполняет join, явно передаёт socket и вызывает relay callback вне state lock.
  • TSynQueue использует OS futex, добавляет WaitPopReset и Waiters, а ожидание с сравнением сохраняет polling.
  • TSynThreadTasks, PendingTasks и WaitFor добавляют управляемые задачи и ожидание завершения; финальные исправления охватывают Delphi, Win8+ и Linux.
  • Исправлены data descriptor ZIP в памяти, завершение REST WebSocket callback и запуск THttpApiServer.

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

Берите полный build 2.4.17356. Обновляйтесь быстро, если AES-GCM может использовать x86-64 AVX, Tunnel или REST WebSocket client завершаются конкурентно либо применяется THttpApiServer. Повторите тесты поддельных AES-GCM данных, циклов Tunnel open/close, queue finalize/reset, timeout в thread-pool WaitFor и запуска HTTP.sys. В raw payload нет superseded_by, поэтому формальный avoid range не заявлен; промежуточные Tunnel и WaitFor commits нельзя брать отдельно.

Сборка2.4.17324 → 2.4.17356
Коммиты32
Строки+2144 -1228
Чтение6 мин

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

Сюжеты
# Запись Категория Модули
1 Критический AVX AES-GCM больше не принимает неаутентифицированные данные TAesGcmEngine.Decrypt переносит финальное сравнение tag после всех single-pass ветвей, включая AvxProcess. Dual-pass путь отмечает уже проверенный tag, чтобы не проверять дважды. Безопасность mormot.crypt.core 3c395af5+13-11

crypt: fixed missing GMAC check in TAesGcmEngine.Decrypt() AVX path

Влияние

На подходящих x86-64 системах с AVX AES-GCM поддельные ciphertext, authentication tag или AAD могли вернуть успех. Scalar и dual-pass пути уже выполняли проверку.

Публичный API

  • TAesGcmEngine.Decryptbehaviour-changed

Модули

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

2 Высокий Передача socket и delayed frames Tunnel стали race-safe OpenInternal принимает socket по var, очищает его после передачи thread, проверяет закрытие под state lock и обрабатывает queued handshake frames вне lock через RelayFrame. Исправления mormot.core.threads+1 1f37f3a4+111-82

net: fixed several races in mormot.net.tunnel

Влияние

Open и OpenSocket избегают двойного закрытия переданных sockets, а callbacks delayed frames не входят повторно под state lock. Следующие Tunnel fixes завершают последовательность.

Публичный API

  • TTunnelLocal.OpenSocketbehaviour-changed

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

3 Высокий Ожидание handshake и закрытие Tunnel получили стабильную модель lock TTunnelLocal заменяет reentrant lock на TOSLightLock, явно инициализирует его, централизует состояние WaitForHandshake и закрывает неудачный handshake после создания thread через ClosePort. Исправления mormot.net.tunnel+1 0900c1f2+75-68

net: still some fixes to mormot Tunnel

Влияние

Конкурентные handshake, timeout, закрытие и уничтожение больше не зависят от рекурсивного lock или nullable event checks. Финальный код действует на всех Tunnel-платформах Delphi и FPC.

Публичный API

  • TTunnelLocal.WaitForHandshakebehaviour-changed
  • TTunnelLocal.ClosePortbehaviour-changed

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

4 Высокий Вызовы transport Tunnel вынесены из state lock родителя Parent lock переименован в fStateSafe, SendFrame фиксирует counters и closed state под ним, а TTunnelLocalThread вызывает ITunnelTransmit.TunnelSend вне lock через helper родителя. Исправления mormot.net.tunnel 7d9ec6c6+62-45

net: fixed TunnelSend() call

Влияние

Реализация transport может блокироваться или входить повторно без deadlock перехода Tunnel. Эта промежуточная форма затем заменена TOSLightLock.

Модули

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

5 Высокий ZIP reader в памяти извлекает последнюю data-descriptor запись TZipRead.Create направляет последнюю локальную запись в памяти на следующий central directory. SearchFromDataDescriptor ищет назад без disk branch и обращения к nil fSource. Исправления mormot.core.zip+1 444fc47e+98-0

core: TZipRead in-memory access to a last entry with data descriptor

Влияние

Открытие ZIP целиком из памяти больше не вызывает EAccessViolation, если последняя запись использует FLAG_DATADESCRIPTOR, как .xlsx/.ods LibreOffice.

Публичный API

  • TZipRead.Createbehaviour-changed

tf · 19:41 UTC · открыть коммит на GitHub →

6 Высокий Tunnel workers теперь принадлежат parent и завершаются через join TTunnelLocalThread больше не использует FreeOnTerminate и сильную ссылку transmit. TTunnelLocal публикует suspended worker, явно запускает, завершает в ClosePort и освобождает в destructor parent после join. Исправления mormot.net.tunnel be0c7136+42-35

net: fixed TTunnelLocalThread lifetime

Влияние

Жизненный цикл worker больше не конкурирует с уничтожением parent и не очищает ссылку owner из worker. Следующие commits нужны для внешних вызовов и handshake locking.

Модули

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

7 Высокий Tunnel forwarding больше не держит state lock во время внешней работы TunnelSend держит lock только для переходов handshake/flags и передаёт обычные frames вне него. ClosePort фиксирует состояние под lock до abort sockets и вызова transport. Исправления mormot.net.tunnel bd4626d4+34-36

net: fixed Tunnel process thread safety

Влияние

Transport callbacks, shutdown socket и доставка frames больше не вызывают deadlock при повторном входе в TTunnelLocal под state lock. Следующие commits уточняют ownership.

Модули

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

8 Высокий WaitFor теперь просыпается при завершении задач на Win8+ и Linux TSynThreadPool добавляет fWaiters вокруг futex wait, а TaskAllDone вызывает OsWakeAllOnValue при завершении последней pending task. Исправления mormot.core.threads b7a92cc1+29-18

core: fixed TSynThreadPool.WaitFor on Win8+ and Linux

Влияние

Новый WaitFor на futex-платформах больше не ждёт истечения timeout после обнуления pending count. Следующий commit точнее выравнивает жизненный цикл счётчика.

Публичный API

  • TSynThreadPool.WaitForbehaviour-changed

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

9 Высокий Completion waiter thread pool теперь совпадает с жизненным циклом futex TSynThreadPool.WaitFor увеличивает fWaiters до расчёта deadline и удерживает счётчик точно вокруг wait loop. TaskAllDone по нему решает, нужен ли OsWakeAllOnValue. Исправления mormot.core.threads fc943be2+8-8

core: tied up TSynThreadPool.WaitFor futex

Влияние

На Win8+ и Linux ожидание завершения всех задач избегает окна потерянного wake-up. Другие платформы сохраняют fallback loop в одну миллисекунду.

Публичный API

  • TSynThreadPool.WaitForbehaviour-changed

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

10 Высокий HTTP.sys server снова автоматически запускается после construction THttpApiServer.Create больше не добавляет hsoCreateSuspended перед THttpServerGeneric.Create. Базовый класс устанавливает fStartAfterConstruction и запускает server thread после завершения constructor chain. Исправления mormot.net.server 1f7febd2+5-6

net: fixed THttpApiServer.Create startup

Влияние

Windows HTTP.sys backend с настройками по умолчанию больше не остаётся suspended после инициализации. Socket-based server Delphi и FPC этот путь не используют.

Публичный API

  • THttpApiServer.Createbehaviour-changed

Модули

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

11 Высокий REST WebSocket callback освобождаются до исчезновения owner TRestClientUri.Destroy переносит FreeAndNilSafe(fFakeCallbacks) во внутренний finally сразу после InternalClose и до inherited Destroy, освобождающего REST model и services. Исправления mormot.rest.client 376e6934+5-5

rest: fixed TRestClientUri WebSockets callbacks finalization

Влияние

Конкурентный WebSocket shutdown больше не оставляет callback storage со ссылкой на уничтожаемый owner. Исправление касается REST clients Delphi и FPC с WebSocket callbacks.

Публичный API

  • TRestClientUri.Destroybehaviour-changed

Модули

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

12 Средний Futex queue ограничен настоящими нефильтрованными consumers TSynQueue не применяет futex wait к PopEquals и WaitPeekLocked, сохраняет polling, предотвращает нулевую sequence после overflow и сбрасывает её после binary load. Исправления mormot.core.threads 53ff22a2+32-21

core: some TSynQueue fixes and enhancements

Влияние

Filtered waits не засыпают бесконечно при неподходящем первом item, а обычный WaitPop сохраняет эффективную OS-блокировку.

Публичный API

  • TSynQueue.WaitPopbehaviour-changed
  • TSynQueue.WaitPeekLockedbehaviour-changed

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

13 Средний Добавлен простой task pool, владеющий объектами задач TSynThreadTask определяет DoExecute, а TSynThreadTasks выполняет объекты через TSynThreadPool. Add всегда принимает ownership, освобождает отклонённые задачи и использует TaskAbort при shutdown. Новые возможности mormot.core.threads+1 27d2e21b+77-5

core: new TSynThreadTasks simple thread-pool class

Влияние

Delphi и FPC приложения могут передавать heap-owned task objects без собственной worker-thread обвязки. После Add вызывающий не должен освобождать task даже при false.

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

При переходе на TSynThreadTasks уберите Free после Add и реализуйте DoExecute без повторного использования task.

Публичный API

  • TSynThreadTaskadded
  • TSynThreadTasksadded

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

14 Средний Thread pool предоставляет общий объём работы и hook последней задачи TSynThreadPool отслеживает queued и executing work в fPendingTasks, публикует PendingTasks и вызывает protected virtual TaskAllDone при обнулении после выполнения или abort. Новые возможности mormot.core.threads f54b3fa0+47-20

core: new TSynThreadPool.PendingTask property

Влияние

Monitoring различает queued contexts и всю незавершённую работу, а descendants могут реагировать на idle. Счётчик работает в IOCP и POSIX путях.

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

Проверьте custom descendants TSynThreadPool, которым нужна idle notification, и используйте финальную семантику 2.4.17356.

Публичный API

  • TSynThreadPool.PendingTasksadded
  • TSynThreadPool.TaskAllDoneadded

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

15 Средний Проверки crypto acceleration стали повторно используемыми runtime API TX64CpuFeatures получает cpuAESGCM, вычисляемый по CLMUL, SSE4.1 и AES-NI. HasAesGcmAvx и HasKeccakAvx2 также учитывают DisabledAsm. Новые возможности mormot.core.base+1 7ee3b216+34-12

core: introducing cpuAESGCM and other crypto HW test functions

Влияние

Код Delphi и FPC x86-64 может узнать то же решение dispatch, что использует crypto engine, без дублирования CPU tests.

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

Используйте HasAesGcmAvx или HasKeccakAvx2, если diagnostics или tests должны следовать реальному runtime dispatch.

Публичный API

  • cpuAESGCMadded
  • HasAesGcmAvxadded
  • HasKeccakAvx2added

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

16 Средний Finalized queue можно активировать и узнать число waiters TSynQueue.WaitPopReset очищает destroying flag только после выхода всех прежних WaitPop. TSynQueue.Waiters возвращает защищённое число waiters. Новые возможности mormot.core.threads 808c57b2+35-3

core: new TSynQueue.WaitPopReset/Waiters methods

Влияние

Queue после WaitPopFinalize можно использовать повторно без перераспределения items, если reset успешен. Monitoring безопасно видит активных consumers.

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

Вызывайте WaitPopReset только после возврата WaitPopFinalize и обрабатывайте false, пока прежний waiter ещё завершается.

Публичный API

  • TSynQueue.WaitPopResetadded
  • TSynQueue.Waitersadded

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

17 Средний Thread pool может ждать завершения всех принятых задач TSynThreadPool.WaitFor следит за PendingTasks до нуля, используя OsWaitOnValue либо короткий sleep fallback. Поддерживаются конечный timeout и INFINITE. Новые возможности mormot.core.threads c7512a04+34-2

core: new TSynThreadPool.WaitFor method

Влияние

Приложения получают completion barrier для принятой работы. Первая реализация требует трёх последующих исправлений и не должна браться отдельно.

Публичный API

  • TSynThreadPool.WaitForadded

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

18 Средний Consumers queue блокируются на нативных OS wait primitives TSynQueue добавляет sequence counter и использует OsWaitOnValue, OsWakeOnValue и OsWakeAllOnValue на Win8+ и Linux. Push будит одного consumer, finalization и binary load — всех. Производительность mormot.core.threads+1 ac7c87e4+71-27

core: rewritten TSynQueue to use the OS futex if possible

Влияние

Обычный WaitPop больше не spin в idle на поддерживаемых системах, снижая CPU и wake latency. Остальные платформы сохраняют SleepStep fallback.

Публичный API

  • TSynQueue.WaitPopbehaviour-changed

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

19 Средний WaitFor стал видимым для Delphi IOCP builds Объявление TSynThreadPool.WaitFor вынесено из non-IOCP условного блока, соответствует реализации и позволяет компилировать Delphi Windows. Компилятор и платформы mormot.core.threads+1 5541a4f1+5-6

core: fixed Delphi compilation

Влияние

Промежуточные builds с новым методом могли не собираться в конфигурации Windows IOCP. Для FPC и non-IOCP объявление уже было видно.

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

20 Средний Состояние закрытия Tunnel собрано в одном защищённом наборе flags Отдельный fClosed включён в TTunnelLocalFlags, обработка frames разделена на handshake-state capture и RelayFrame. CallbackReleased вызывает ClosePort(FromNotify=true). Внутреннее устройство mormot.net.tunnel d60cc6e8+46-48

net: internal Tunnel flags refactoring

Влияние

Состояние закрытия атомарно с другими защищёнными flags, remote notification стала идемпотентной. Это промежуточный refactor перед следующими fixes.

Модули

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

21 Низкий Ошибки тестов получили exception-aware helper TSynTestCase.FailedRaised форматирует Exception через ObjectToJsonDebug перед TestFailed. Фильтр stack symbols также убирает redirect frames mormot.core.log и mormot.core.test. Новые возможности mormot.core.log+2 311e29ed+45-36

core: introducing TSynTestCase.FailedRaised method

Влияние

Custom mORMot test suites могут единообразно сообщать неожиданные исключения с более чистыми caller locations. Production runtime не меняется.

Публичный API

  • TSynTestCase.FailedRaisedadded

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

22 Низкий Внутренние atomic increments используют единый pointer-based helper Четыре вызова InterlockedIncrement в генерации последовательностей, thread-pool accounting, ECC refcount и тестах заменены на LockedInc32 с явными адресами. Компилятор и платформы mormot.core.base+3 883ee3ae+9-9

core: use LockedInc32() instead of InterlockedIncrement()

Влияние

Поведение не меняется; код единообразно использует atomic wrapper framework на Delphi и FPC.

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

23 Низкий Конкурентные тесты queue перешли на новый owned-task pool test.core.threads заменяет отдельные push/wait thread classes наследниками TSynThreadTask в одном TSynThreadTasks, сохраняя finalize, reset и multi-waiter coverage. Тесты test.core.threads c18eb6c5+340-333

test: rewrite TSynQueue using TSynThreadTasks

Влияние

Поведение приложений не меняется. Набор тестов проверяет новую модель владения task pool вместе с конкурентностью TSynQueue.

Модули

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

24 Низкий Покрытие queue перенесено в модуль тестов threads Полные тесты TSynQueue для значений, persistence и workers перенесены из test.core.base в test.core.threads к проверяемым примитивам конкурентности. Тесты test.core.base+2 d73f877c+200-233

test: moved TSynQueue tests to test.core.threads.pas

Влияние

Поведение приложений не меняется; организация тестов теперь соответствует области реализации.

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

25 Низкий Futex-пути queue получили конкурентные тесты wake и shutdown test.core.threads добавляет delayed producers, восемь WaitPop consumers, распределение WakeOne, WakeAll в WaitPopFinalize и проверки отказа после finalization. Тесты test.core.threads db598d3b+257-4

test: completed TSynQueue coverage

Влияние

Код приложений не меняется. Поведение futex на Windows и Linux проверяется настоящими конкурентными waiters.

Модули

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

26 Низкий Reset queue получил повторное multi-waiter покрытие test.core.threads добавляет циклы finalize/reset с восемью waiting threads, проверяет wake-one после reset и работу queue после второго цикла. Тесты test.core.threads 3e909874+121-40

test: enhanced TSynQueue coverage

Влияние

Поведение приложений не меняется. Контракт WaitPopReset проверяется с конкурентными sleepers, а не только последовательными вызовами.

Модули

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

27 Низкий Regression tests сообщают неожиданные исключения структурированно ZIP, network и ORM tests заменяют Check(false, E.Message) на TSynTestCase.FailedRaised. ZIP data-descriptor fixture переписан на фиксированный temporary buffer. Тесты mormot.core.test+4 fc0d9757+80-75

test: some cleanup especially after #630

Влияние

Поведение приложений не меняется. Ошибки тестов сохраняют class исключения и структурированные поля для диагностики.

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

28 Низкий Crypto tests выбирают ускорение через публичные capability helpers TTestCoreCrypto заменяет compile-time предположения AVX на HasKeccakAvx2 и HasAesGcmAvx, расширяет поддельные AES-GCM cases и проверяет неаутентифицированный plaintext. Тесты test.core.crypt f9ad68c8+43-25

test: refined TTestCoreCrypto content

Влияние

Поведение приложений не меняется. Тесты запускают только ускорение, поддержанное hardware, OS state и DisabledAsm.

Модули

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

29 Низкий AES-GCM tests отклоняют изменённые ciphertext, tag и associated data _AES_GCM шифрует и проверяет длины 1–64 в scalar и доступном AVX режиме, затем отдельно меняет ciphertext, authentication tag и AAD и требует отказа проверки. Тесты test.core.crypt 5f464423+24-1

test: cover forged AES-GCM ciphertext, tag and AAD in _AES_GCM

Влияние

Поведение приложений не меняется. Regression напрямую покрывает authentication bypass из предыдущего commit.

Модули

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

30 Низкий Правила lock и ownership Tunnel описаны рядом с кодом mormot.net.tunnel фиксирует правила конкурентности: короткие state locks, никаких внешних вызовов под lock, workers у owner и двухфазный shutdown. TTunnelLocalThread.Abort также допускает self=nil. Документация mormot.net.tunnel 2ad1823e+27-2

net: add some comments about Tunnel internal algorithms & patterns

Влияние

Комментарии не меняют поведение приложений. Nil guard делает внутренний shutdown защитным.

Модули

Arnaud Bouchez · 16:40 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