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

Сессии Tunnel стали непредсказуемыми, добавлены sockets по требованию

Основные изменения касаются Tunnel: TTunnelRelay теперь выдаёт непредсказуемые идентификаторы сессий, а TTunnelLocal умеет ждать handshake через событие и принимать уже подключённый socket. Также улучшена безопасность Tunnel-кэшей, очистки временных сессий и повторного либо конкурентного Shutdown асинхронных серверов. Для Delphi 10–10.3 и FPC добавлены точечные исправления компиляции, сборки и уничтожения потоков.

Коротко

  • Идентификаторы сессий TTunnelRelay теперь создаются Random128 через Random9Digits вместо предсказуемого NetRandom32.
  • TTunnelLocal получил WaitForHandshake и OpenSocket для forwarding по требованию; используйте build 2.4.16776, а не незавершённый build 2.4.16768.
  • Обновление Tunnel-кэша, очистка временных сессий и Shutdown асинхронных серверов теперь не допускают конкурентного или повторного выполнения.
  • Delphi 10–10.3 обходит известные ошибки компилятора в pointer expressions и inline, а уничтожение потока FPC POSIX избегает лишней задержки 100 мс.

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

Для Tunnel и асинхронных серверов следует брать build 2.4.16776 целиком. Не останавливайтесь на build 2.4.16768: реализация TTunnelLocal.WaitForHandshake там появилась раньше объявления метода в классе, добавленного следующей сборкой. Пользователям Delphi 10–10.3 также стоит взять итоговую ревизию ради обходов ошибок компилятора.

Сборка2.4.16753 → 2.4.16776
Коммиты23
Строки+706 -211
Чтение6 мин

22 из 22 записей · 23 коммитов в апстриме

Сюжеты
# Запись Категория Модули
1 Высокий Ожидание handshake стало событийным, но эта промежуточная build неполна TTunnelLocal получает fHandshakeEvent и реализацию WaitForHandshake: метод проверяет очередь под fSendSafe, ждёт TSynEvent без извлечения кадра, проверяет session trailer и просыпается при ClosePort. В этой ревизии реализация уже есть, но объявления в TTunnelLocal ещё нет; оно появляется в c38c36d. Несовместимые измененияinterp mormot.net.tunnel d2419079+63-5

net: new TTunnelLocal.WaitForHandshake method

Влияние

Событийная схема устраняет polling и сохраняет ранний сигнал, однако build 2.4.16768 нельзя использовать как конечную: метод реализован до объявления. Публичная поверхность класса завершена в build 2.4.16769.

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

Не фиксируйтесь на build 2.4.16768; используйте build 2.4.16776 с объявлением и последующим исправлением закрытия.

Модули

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

2 Высокий Распределение Tunnel-сессий больше не использует предсказуемый PRNG TTunnelRelay.PrepareNewSession в mormot.net.tunnel заменяет NetRandom32 shr 4 значениями из Random128. Метод проверяет до трёх 32-bit слов для ненулевого кандидата, сохраняет проверку коллизий под fConsoleSafe и очищает временный random buffer. Безопасность mormot.net.tunnel 34791460+13-6

net: fixed TTunnelRelay.PrepareNewSession number predicability

Влияние

Relay больше не выдаёт идентификаторы из явно некриптографической последовательности NetRandom32. Прямая предсказуемость устранена без изменения размера TTunnelSession или сигнатур relay service; diff не доказывает полный сценарий захвата сессии.

Публичный API

  • TTunnelRelay.PrepareNewSessionbehaviour-changed — Идентификаторы сессий теперь поступают из Random128 вместо NetRandom32.

Модули

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

3 Высокий Повторный Shutdown асинхронного сервера не входит в очистку снова TLoggedThread в mormot.core.threads получает три protected byte flags. TAsyncConnections.Shutdown и обе backend-реализации TAsyncServer.Shutdown используют отдельные flags для выхода при повторном вызове, а THttpAsyncServer.DoExecute также завершается при fShutdownInProgress. Исправления mormot.core.threads+1 93b26a97+16-5

net: fixed nested Shutdown calls of async servers

Влияние

Destructor и явный Shutdown больше не повторяют IOCP unsubscribe, завершение sockets или освобождение accept для одного экземпляра. Это уменьшает shutdown races и двойную очистку в асинхронных HTTP/WebSocket-серверах Delphi и FPC.

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

4 Средний Только один поток обновляет ежесекундный информационный кэш Tunnel Несмотря на переставленный заголовок commit, diff меняет TTunnelList.GetAllInfo в mormot.net.tunnel. LockedExc32 на fInfoCacheTix32 выбирает одного вызывающего для snapshot текущей секунды; остальные копируют fInfoCache под fInfoCacheSafe. Исправления mormot.net.tunnel d1512dde+26-25

net: made TTunnelList.PurgeTransient atomic

Влияние

Параллельные запросы мониторинга больше не строят одновременно один snapshot TunnelInfo. API приложения не меняется; сбор статуса relay выполняет один проход callbacks в секунду.

Модули

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

5 Средний Периодическая очистка временных tunnels получила единственного атомарного владельца Несмотря на переставленный заголовок, diff меняет TTunnelList.PurgeTransient. LockedExc32 атомарно захватывает каждый 16-секундный цикл до fSafe, сравнение timeout использует безопасное при переполнении вычитание, а fInfoCacheTix32 сбрасывается только после реального удаления Tunnel. Исправления mormot.net.tunnel 1915e014+14-14

net: made TTunnelList.GetAllInfo cache atomic

Влияние

Параллельные вызовы не выполняют один цикл очистки дважды, а длительная работа не ломает timeout при переполнении cardinal. Relay меньше блокируется и избегает повторного освобождения callbacks.

Модули

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

6 Средний Кадр закрытия будит и останавливает Tunnel во время handshake TTunnelLocal.TunnelSend в mormot.net.tunnel распознаёт кадр закрытия только с session, пока существует fHandshake. Метод устанавливает fClosePortNotified, сигнализирует fHandshakeEvent, отмечает fClosed и выходит, не помещая пустой кадр в handshake queue. Исправления mormot.net.tunnel 9609945c+12-2

net: fixed TTunnelLocal early shutdown

Влияние

WaitForHandshake быстро возвращает управление, если удалённая сторона закрылась до завершения настройки. Отложенный Tunnel больше не принимает уведомление закрытия за данные handshake и не ждёт timeout.

Модули

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

7 Средний Логирование кадров WebSocket больше не сбрасывает состояние remote log без необходимости TWebSocketProcess.Log в mormot.net.ws.core вызывает TSynLog.DisableRemoteLog до и после записи кадра только при аргументе DisableRemoteLog=true. В SendFrame этот true-аргумент указан явно. Исправления mormot.net.ws.core 72c81483+7-5

net: fixed TWebSocketProcess.Log() code

Влияние

Вызовы логирования на приёме и другие вызовы с DisableRemoteLog=false больше не принудительно включают remote log. SendFrame по-прежнему подавляет удалённую отправку вокруг собственной trace-записи, предотвращая рекурсию WebSocket.

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

Если WebSocketLog отправляет данные в remote sink, проверьте, что receive/send traces сохраняют нужное состояние подавления remote log.

Модули

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

8 Средний Ошибка настройки ECDHE теперь вызывает явное исключение Tunnel TTunnelLocal.OpenInternal в mormot.net.tunnel заменяет тихий выход после ошибки Ecc256r1SharedSecret на ETunnel.RaiseUtf8. Исключение указывает TTunnelLocal и локальный порт. Исправления mormot.net.tunnel 8d1d4fc7+4-3

net: another Tunnel logic improvement

Влияние

Недопустимый открытый ключ ECDHE теперь даёт явную ошибку вместо неоднозначного нулевого результата Open. Код, намеренно передающий повреждённый handshake, должен ожидать ETunnel.

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

Проверьте обработку исключений вокруг TTunnelLocal.Open и OpenSocket, если ключи handshake могут поступать от недоверенных peers.

Публичный API

  • TTunnelLocal.Openbehaviour-changed — Ошибка Ecc256r1SharedSecret теперь вызывает ETunnel вместо тихого выхода.

Модули

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

9 Средний Приложение может передать подключённый socket в TTunnelLocal mormot.net.tunnel публикует TTunnelLocal.WaitForHandshake и добавляет TTunnelLocal.OpenSocket. OpenSocket проверяет ненулевой socket и порт, передаёт владение с обнулением переменной вызывающего кода и делит настройку handshake с Open через protected OpenInternal. Документация ITunnelOpen теперь описывает сценарий по требованию, похожий на SSH -R. Новые возможности mormot.net.tunnel c38c36da+158-44

net: introduced late access to the local Tunnel socket

Влияние

Обратный forwarding наподобие VNC может отложить подключение backend до появления реального локального клиента. Контракт существующего Open не меняется; после корректного OpenSocket нельзя закрывать или повторно использовать Socket, поскольку владение перешло к TTunnelLocal.

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

Перед заменой существующего сценария Open на forwarding по требованию проверьте владение socket, оба направления handshake, timeout и закрытие peer.

Публичный API

  • TTunnelLocal.WaitForHandshakeadded — Ждёт первый handshake peer в очереди, не извлекая его.
  • TTunnelLocal.OpenSocketadded — Запускает Tunnel поверх подключённого TNetSocket и принимает владение им.

Модули

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

10 Средний Единый helper создаёт все непредсказуемые девятизначные номера сессий mormot.crypt.core добавляет публичную функцию Random9Digits. Она берёт три cardinal-кандидата из Random128, очищает временный 128-bit buffer и возвращает 100000000..999999999 либо ноль, только если все кандидаты нулевые. TTunnelRelay.PrepareNewSession в mormot.net.tunnel теперь вызывает этот helper. Новые возможности mormot.crypt.core+1 da7e1c2f+23-11

crypt: new Random9Digits() function

Влияние

Идентификатор Tunnel сохраняет 32-bit представление в протоколе, но теперь всегда состоит ровно из девяти цифр и использует CSPRNG фреймворка. Другой Delphi/FPC-код может применять helper при подходящем диапазоне и контракте нуля как ошибки.

Публичный API

  • Random9Digitsadded — Возвращает непредсказуемый cardinal в диапазоне 100000000..999999999 или ноль при отказе Random128.

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

11 Средний Delphi 10–10.3 получил точечные обходы ошибок pointers и inline mormot.defines.inc определяет ISDELPHI10_103 для версий компилятора 30–33. mormot.core.buffers отключает inline у FromVarInt32 в этом диапазоне, а mormot.core.base заменяет typed pointer casts в AppendShortCurr64 с @p[index] на принимаемую этими компиляторами pointer arithmetic. Компилятор и платформы mormot.core.base+1 92d840ee+10-6

core: circumvent Delphi 10.x compiler bugs

Влияние

Проекты на Delphi 10, 10.1, 10.2 и 10.3 обходят известные сбои компилятора при variable-integer decoding и текстовом форматировании Currency. Поведение остаётся прежним; FPC и другие версии Delphi не используют новый conditional.

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

12 Низкий TNetAddr распознаёт весь IPv4 loopback и IPv6 ::1 mormot.net.sock добавляет публичный метод TNetAddr.IsLoopback. Он возвращает true для любого AF_INET-адреса с первым байтом 127 и для шаблона AF_INET6 ::1, иначе false. Новые возможности mormot.net.sock be380064+20-2

net: new TNetAddr.IsLoopback method

Влияние

Сетевой код может выполнить одну проверку локального адреса с учётом family вместо сравнения только с 127.0.0.1. Существующий код не затронут; Tunnel accept применяет helper в последующем commit.

Публичный API

  • TNetAddr.IsLoopbackadded — Возвращает true для адресов 127.x.x.x и ::1.

Модули

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

13 Низкий CheckHash принимает raw buffers наряду с managed strings mormot.core.test добавляет overload TSynTestCase.CheckHash с data: pointer и len: PtrInt. Существующий overload RawByteString делегирует ему, а общая реализация вычисляет Hash32(data, len) перед diagnostic assertion. Новые возможности mormot.core.test 3ad5bbe2+13-4

core: new TSynTestCase.CheckHash() overload

Влияние

Тесты могут проверять streams, short strings и произвольную память без предварительного RawByteString. Production runtime не затронут, поскольку добавление находится в test unit.

Публичный API

  • TSynTestCase.CheckHash(pointer, PtrInt, cardinal, RawUtf8)added — Новый overload вычисляет hash явного memory buffer заданной длины.

Модули

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

14 Низкий Relay-сканирование и копирование кэша используют более компактные pointer loops mormot.net.tunnel вводит PTunnelRelayConsole и переписывает HasConsolePrepared и ConsolesInfo на продвижение record pointers. TTunnelList.GetAllInfo также убирает try/finally вокруг коротких присваиваний под тем же lock, сохраняя поведение выхода. Производительность mormot.net.tunnel 89996223+28-28

net: slightly optimized TTunnelRelay process

Влияние

Перечисление метаданных relay выполняет меньше индексных операций и exception-frame работы. Публичные результаты и семантика блокировок остаются прежними, изменения Delphi/FPC-приложений не нужны.

Модули

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

15 Низкий Уничтожение потока FPC POSIX по возможности обходит фиксированное ожидание RTL TThreadAbstract переопределяет Destroy только под FPCPOSIX. Когда главный поток освобождает активный неприостановленный поток, вызывается Terminate, затем короткий цикл CheckSynchronize и SleepHiRes до Finished или 100 мс, после чего вызывается inherited destructor. Производительность mormot.core.threads efc0950e+28-2

core: override TThreadAbstract.Destroy on FPC POSIX

Влияние

Короткоживущие объекты потоков FPC POSIX могут завершиться до обычной задержки WaitFor на 100 мс в RTL. Для Delphi и Windows это переопределение не компилируется.

Публичный API

  • TThreadAbstract.Destroybehaviour-changed — На FPC POSIX активный поток получает ограниченный cooperative finish loop перед inherited destruction.

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

16 Низкий Внутренний matcher секций INI использует цикл, совместимый с Delphi 10 IdemPChar2 в mormot.core.fmt переписан с repeat loop и временным AnsiChar на while loop с прямым сравнением table[up[PtrUInt(p)]] и продвижением up только при совпадении. Компилятор и платформы mormot.core.fmt 00f6828c+12-13

core: refactored INI parsing for Delphi 10.x

Влияние

Нормализованное по регистру сравнение имён секций INI сохраняется, но устраняется форма кода, проблемная для Delphi 10.x. API приложений FPC и новых Delphi не меняется.

Модули

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

17 Низкий Canary builds Windows получили актуальные desktop и server метки mormot.core.os обновляет таблицы builds: desktop build 29570 обозначается Windows 11 27H2, desktop 26300 остаётся 26H2, а server build 29651 обозначается Windows Server 26H2. Delphi test batch также включает оптимизацию и NO_UI для настроенных нестандартных компиляторов. Компилятор и платформы mormot.core.os 61a6fc1b+12-9

core: detect Windows 11 27H2 and Windows Server 26H2 canary versions

Влияние

OSVersionText показывает нужные метки на этих preview builds вместо более старой категории. Выбор runtime-возможностей не меняется, поскольку diff правит только описательные lookup tables.

Модули

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

18 Низкий Windows-тесты FPC из командной строки явно отключают UI units test/build_fpc.sh добавляет -dNO_UI для целей win*, а test/build_winarm.bat — тот же define для aarch64-win64. mormot2tests больше не требует Lazarus Interfaces и test.ui.pdf без настроенного widgetset path. Компилятор и платформы 55d28b7f+4-2

tests: define NO_UI in the command line FPC build scripts

Влияние

Сборка тестов репозитория из командной строки снова работает на FPC Windows и aarch64-win64 без LCL. Lazarus package builds сохраняют UI-покрытие, flags приложений не меняются.

Sven Harazim · 10:41 UTC · открыть коммит на GitHub →

19 Низкий Отложенные tunnels получили прямые и WebSocket end-to-end тесты test.net.proto добавляет TunnelDeferred. Тест готовит обе стороны relay, принимает viewer socket до подключения backend, ждёт handshake, обменивается VNC-подобными banner в обоих направлениях и повторяет сценарий через SOA callbacks поверх WebSockets. Тесты e22ca7df+186-2

tests: cover deferred Tunnel connection

Влияние

Код приложения не меняется. Новый путь TTunnelLocal по требованию проверяется как без transport serialization, так и через реальный маршрут WebSocket callback.

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

20 Низкий Проект тестов Lazarus распознаёт десять ожидаемых классов исключений test/mormot2tests.lpi регистрирует десять классов исключений, включая EHttpSocket, EYamlException, EStreamError и EJsonObjectDecoder, в настройках отладчика Lazarus. Тесты 1b9767fa+34-2

test: ease mormot2tests debugging by registering some exceptions

Влияние

Изменяется только поведение отладчика в проекте тестов Lazarus. Код фреймворка, тесты вне отладки и сборки приложений не меняются.

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

21 Низкий Regression hashes единообразно показывают ожидаемое и фактическое значения Четыре test units заменяют прямые сравнения Hash32 на TSynTestCase.CheckHash. Buffers pointer-length, сериализованные variants, SOA JSON и память PDF используют единый диагностический assertion; PDF-константы записаны в hex. Тесты 07032883+14-14

tests: use new CheckHash()

Влияние

При ошибке regression tests показывают более ясную диагностику hash, особенно при различиях PDF font embedding между системами. Runtime фреймворка и код приложения не меняются.

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

22 Низкий Проверки loopback используют общие helpers и константы адреса mormot.net.sock заменяет два использования текста cLocalhost на IP4local. TTunnelLocalThread.DoExecute в mormot.net.tunnel использует TNetAddr.IsLoopback вместо сравнения только fClientAddr.IP4 с cLocalhost32. Обслуживание mormot.net.sock+1 0ce4b076+5-5

net: minor loopback definitions usage

Влияние

Допуск локального Tunnel теперь следует общему определению IPv4 и IPv6 loopback, поэтому ::1 считается локальным. Поведение IPv4 localhost не меняется.

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