Стоит взглянутьисправление или функция, которая может пригодитьсяВ исходном payload нет отметок superseded_by. Поэтому рекомендована итоговая ревизия редакции: она включает все поэтапные изменения Tunnel и исключает явно незавершённую промежуточную build 2.4.16768.
Сессии 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 также стоит взять итоговую ревизию ради обходов ошибок компилятора.
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 с объявлением и последующим исправлением закрытия.
Модули
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 не доказывает полный сценарий захвата сессии.
Рекомендуется обновиться
Обновите любой TTunnelRelay за пределами полностью доверенной границы и возьмите build 2.4.16776 с окончательной реализацией Random9Digits.
Публичный API
TTunnelRelay.PrepareNewSessionbehaviour-changed — Идентификаторы сессий теперь поступают из Random128 вместо NetRandom32.
Модули
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.
Рекомендуется обновиться
Обновите асинхронные серверы, где несколько уровней владения могут вызвать Shutdown до destruction, затем проверьте циклы запуска-остановки и очистку после неудачного запуска.
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 в секунду.
Рекомендуется обновиться
Обновите relay, где GetAllInfo вызывается конкурентно или ConsolesInfo доступен нескольким клиентам мониторинга.
Модули
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.
Рекомендуется обновиться
Возьмите исправление для relay services с конкурентным обслуживанием сессий или очень длительным uptime.
Модули
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.
Рекомендуется обновиться
Возьмите исправление вместе с полной серией WaitForHandshake/OpenSocket в build 2.4.16776 и проверьте закрытие peer во время настройки.
Модули
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.
Модули
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 вместо тихого выхода.
Модули
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 и принимает владение им.
Модули
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 при подходящем диапазоне и контракте нуля как ошибки.
Рекомендуется обновиться
Пользователям Tunnel relay следует перейти на build 2.4.16776, чтобы получить непредсказуемое распределение вместе с итоговым helper диапазона.
Публичный API
Random9Digitsadded — Возвращает непредсказуемый cardinal в диапазоне 100000000..999999999 или ноль при отказе Random128.
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.
Рекомендуется обновиться
Командам Delphi 10–10.3 следует пересобрать затронутые targets на build 2.4.16776 и повторить тесты сериализации и форматирования Currency.
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.
Модули
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 заданной длины.
Модули
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-приложений не нужны.
Модули
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.
Модули
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 не меняется.
Модули
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.
Модули
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 приложений не меняются.
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.
20
Низкий
Проект тестов Lazarus распознаёт десять ожидаемых классов исключений
test/mormot2tests.lpi регистрирует десять классов исключений, включая EHttpSocket, EYamlException, EStreamError и EJsonObjectDecoder, в настройках отладчика Lazarus.
Тесты
1b9767fa+34-2
test: ease mormot2tests debugging by registering some exceptions
Влияние
Изменяется только поведение отладчика в проекте тестов Lazarus. Код фреймворка, тесты вне отладки и сборки приложений не меняются.
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 фреймворка и код приложения не меняются.
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 не меняется.