Требует действийможет затронуть работающую системуПроверены все 30 non-merge commits, два merge исключены. Без mormot.commit.inc и mormot.commit-num.inc итог составляет 1 955 добавлений и 1 162 удаления. Проверен финальный исходный код 1f7febd219f9cb54175a1f87620e6862e4e670b8. Ни один commit не содержит superseded_by.
Проверка 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 нельзя брать отдельно.
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 пути уже выполняли проверку.
Рекомендуется обновиться
Обновитесь немедленно, если TAesGcmEngine может выбрать AVX, и добавьте негативные тесты с изменением ciphertext, tag и AAD.
Публичный API
TAesGcmEngine.Decryptbehaviour-changed
Модули
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
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.
Рекомендуется обновиться
Берите всю последовательность Tunnel до 0900c1f2 и проверьте early frames, remote close, timeout и уничтожение во время handshake.
Публичный API
TTunnelLocal.WaitForHandshakebehaviour-changedTTunnelLocal.ClosePortbehaviour-changed
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.
Модули
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.
Рекомендуется обновиться
Обновитесь, если ZIP, XLSX или ODS загружается в память, и проверьте извлечение последней записи архива.
Публичный API
TZipRead.Createbehaviour-changed
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.
Модули
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.
Модули
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
Модули
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 в одну миллисекунду.
Рекомендуется обновиться
Используйте финальный WaitFor из 2.4.17356 и проверьте конечные и INFINITE ожидания при конкурентном завершении.
Публичный API
TSynThreadPool.WaitForbehaviour-changed
Модули
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 этот путь не используют.
Рекомендуется обновиться
Обновитесь до 2.4.17356 и проверьте, что каждый THttpApiServer принимает запросы сразу после construction.
Публичный API
THttpApiServer.Createbehaviour-changed
Модули
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.
Рекомендуется обновиться
Обновитесь и нагрузочно проверьте повторные connect, регистрацию callback, disconnect и уничтожение TRestClientUri из конкурентных threads.
Публичный API
TRestClientUri.Destroybehaviour-changed
Модули
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-changedTSynQueue.WaitPeekLockedbehaviour-changed
Модули
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
TSynThreadTaskaddedTSynThreadTasksadded
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.PendingTasksaddedTSynThreadPool.TaskAllDoneadded
Модули
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
cpuAESGCMaddedHasAesGcmAvxaddedHasKeccakAvx2added
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.WaitPopResetaddedTSynQueue.Waitersadded
Модули
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
Модули
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
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 объявление уже было видно.
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.
Модули
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
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.
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.
Модули
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
Влияние
Поведение приложений не меняется; организация тестов теперь соответствует области реализации.
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.
Модули
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, а не только последовательными вызовами.
Модули
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 исключения и структурированные поля для диагностики.
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.
Модули
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.
Модули
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 защитным.