mORMot2 DailyLecture quotidienne des commits upstream

Les sessions Tunnel deviennent imprévisibles et les sockets s’ouvrent à la demande

Les utilisateurs de Tunnel reçoivent les changements principaux : TTunnelRelay alloue désormais des identifiants de session imprévisibles, tandis que TTunnelLocal sait attendre le handshake par événement et prendre possession d’un socket déjà connecté. La série sécurise aussi les caches Tunnel, le nettoyage transitoire et l’arrêt répété ou concurrent des serveurs asynchrones. Delphi 10–10.3 et FPC reçoivent des corrections ciblées de compilation, de build et de destruction des threads.

En bref

  • Les identifiants de session TTunnelRelay proviennent maintenant de Random128 via Random9Digits au lieu du générateur prévisible NetRandom32.
  • TTunnelLocal ajoute WaitForHandshake et OpenSocket pour le transfert à la demande ; prenez la build 2.4.16776, pas la build incomplète 2.4.16768.
  • Le rafraîchissement du cache Tunnel, la purge transitoire et les chemins Shutdown des serveurs asynchrones refusent désormais les exécutions concurrentes ou répétées.
  • Delphi 10–10.3 évite des bugs connus sur les expressions de pointeur et l’inlining, tandis que la destruction des threads sous FPC POSIX évite une attente inutile de 100 ms.

Conseil de mise à jour

Les déploiements Tunnel et de serveurs asynchrones devraient prendre la build 2.4.16776 comme un ensemble complet. Ne vous arrêtez pas à la build 2.4.16768 : elle contient l’implémentation de TTunnelLocal.WaitForHandshake avant l’ajout de sa déclaration de classe dans la build suivante. Les utilisateurs de Delphi 10–10.3 devraient aussi prendre la tête pour les contournements du compilateur.

Build2.4.16753 → 2.4.16776
Commits23
Lignes+706 -211
Lecture8 min

22 sur 22 entrées · 23 commits upstream

Sujets
# Entrée Catégorie Unités
1 Élevée L’attente du handshake devient événementielle, mais cette build intermédiaire est incomplète TTunnelLocal reçoit fHandshakeEvent et une implémentation de WaitForHandshake qui vérifie la file sous fSendSafe, attend TSynEvent sans consommer la trame, valide la session finale et se réveille sur ClosePort. Dans cette révision, l’implémentation existe mais sa déclaration manque encore dans TTunnelLocal ; elle arrive dans c38c36d. Rupturesinterp mormot.net.tunnel d2419079+63-5

net: new TTunnelLocal.WaitForHandshake method

Impact

La conception par événement supprime le polling et conserve une notification précoce, mais la build 2.4.16768 n’est pas un point d’arrêt valide, car la méthode est implémentée avant d’être déclarée. La build 2.4.16769 complète la surface publique de la classe.

À regarder

Ne figez pas la build 2.4.16768 ; utilisez la build 2.4.16776 afin d’inclure la déclaration et le correctif ultérieur de fermeture.

Arnaud Bouchez · 16:47 UTC · voir le commit sur GitHub →

2 Élevée L’allocation des sessions Tunnel abandonne un PRNG prévisible TTunnelRelay.PrepareNewSession dans mormot.net.tunnel remplace NetRandom32 shr 4 par des valeurs dérivées de Random128. Il teste jusqu’à trois mots de 32 bits pour obtenir un candidat non nul, conserve les contrôles de collision sous fConsoleSafe et efface le buffer aléatoire temporaire. Sécurité mormot.net.tunnel 34791460+13-6

net: fixed TTunnelRelay.PrepareNewSession number predicability

Impact

Le relais n’émet plus d’identifiants de session depuis la séquence explicitement non cryptographique NetRandom32. Leur prévisibilité directe disparaît sans modifier la taille de TTunnelSession ni les signatures du service ; le diff ne démontre pas un scénario complet de détournement de session.

API publique

  • TTunnelRelay.PrepareNewSessionbehaviour-changed — Les identifiants de session proviennent maintenant de Random128 plutôt que de NetRandom32.

Arnaud Bouchez · 18:30 UTC · voir le commit sur GitHub →

3 Élevée L’arrêt répété d’un serveur asynchrone ne réentre plus dans le nettoyage TLoggedThread dans mormot.core.threads reçoit trois drapeaux byte protégés. TAsyncConnections.Shutdown et les deux backends de TAsyncServer.Shutdown utilisent des drapeaux distincts pour ignorer les appels répétés, tandis que THttpAsyncServer.DoExecute sort aussi lorsque fShutdownInProgress est posé. Correctifs mormot.core.threads+1 93b26a97+16-5

net: fixed nested Shutdown calls of async servers

Impact

Le destructeur et l’arrêt explicite ne peuvent plus répéter le désabonnement IOCP, la terminaison des sockets ou la libération de accept sur la même instance. Cela réduit les courses à l’arrêt et les nettoyages doubles des serveurs HTTP/WebSocket asynchrones Delphi et FPC.

Arnaud Bouchez · 16:39 UTC · voir le commit sur GitHub →

4 Moyenne Un seul thread rafraîchit désormais le cache d’informations Tunnel par seconde Malgré le titre de commit inversé, ce diff modifie TTunnelList.GetAllInfo dans mormot.net.tunnel. LockedExc32 sur fInfoCacheTix32 désigne un seul appelant pour construire le snapshot de la seconde courante ; les autres copient fInfoCache sous fInfoCacheSafe. Correctifs mormot.net.tunnel d1512dde+26-25

net: made TTunnelList.PurgeTransient atomic

Impact

Les requêtes de supervision concurrentes ne reconstruisent plus simultanément le même snapshot TunnelInfo. Les API applicatives ne changent pas ; la collecte d’état du relais effectue un seul passage de callbacks par seconde.

Arnaud Bouchez · 16:45 UTC · voir le commit sur GitHub →

5 Moyenne La purge des tunnels transitoires a désormais un seul propriétaire atomique Malgré le titre inversé, ce diff modifie TTunnelList.PurgeTransient. LockedExc32 réserve atomiquement chaque intervalle de purge de 16 secondes avant l’acquisition de fSafe, la comparaison du timeout devient une soustraction sûre en cas de retour à zéro, et fInfoCacheTix32 n’est invalidé que si un tunnel a réellement été supprimé. Correctifs mormot.net.tunnel 1915e014+14-14

net: made TTunnelList.GetAllInfo cache atomic

Impact

Des appelants concurrents ne peuvent plus exécuter deux fois le même cycle de purge et les longues durées d’activité ne cassent pas la détection au retour à zéro du cardinal. Le relais verrouille moins et évite de libérer deux fois les mêmes callbacks.

Arnaud Bouchez · 16:44 UTC · voir le commit sur GitHub →

6 Moyenne Une trame de fermeture réveille et arrête désormais un Tunnel encore en handshake TTunnelLocal.TunnelSend dans mormot.net.tunnel détecte une trame de fermeture ne contenant que la session tant que fHandshake existe. Il pose fClosePortNotified, signale fHandshakeEvent, marque fClosed et sort au lieu d’ajouter la trame vide à la file du handshake. Correctifs mormot.net.tunnel 9609945c+12-2

net: fixed TTunnelLocal early shutdown

Impact

WaitForHandshake peut revenir immédiatement si l’extrémité distante ferme avant la fin de l’initialisation. Les tunnels différés ne prennent plus une notification de fermeture pour des données de handshake et n’attendent plus le timeout.

Arnaud Bouchez · 16:53 UTC · voir le commit sur GitHub →

7 Moyenne Le log des trames WebSocket ne réinitialise plus inutilement l’état du log distant TWebSocketProcess.Log dans mormot.net.ws.core appelle désormais TSynLog.DisableRemoteLog seulement lorsque son argument DisableRemoteLog vaut true, avant comme après l’écriture de la trame. SendFrame rend cet argument true explicite au site d’appel. Correctifs mormot.net.ws.core 72c81483+7-5

net: fixed TWebSocketProcess.Log() code

Impact

Les logs de réception ou autres appels avec DisableRemoteLog=false ne forcent plus le logger à réactiver le log distant. SendFrame continue de supprimer le transfert distant autour de sa propre trace afin d’éviter une récursion WebSocket.

À regarder

Si WebSocketLog transmet vers une destination distante, vérifiez que les traces de réception et d’envoi conservent désormais l’état de suppression attendu.

Arnaud Bouchez · 08:36 UTC · voir le commit sur GitHub →

8 Moyenne Un échec d’initialisation ECDHE lève maintenant une exception Tunnel précise TTunnelLocal.OpenInternal dans mormot.net.tunnel remplace la sortie silencieuse après un échec de Ecc256r1SharedSecret par ETunnel.RaiseUtf8. L’exception identifie TTunnelLocal et inclut le port local. Correctifs mormot.net.tunnel 8d1d4fc7+4-3

net: another Tunnel logic improvement

Impact

Une clé publique ECDHE distante invalide produit maintenant un échec explicite au lieu d’un résultat Open ambigu de type zéro. Les appelants qui injectent volontairement des handshakes malformés doivent prévoir ETunnel sur ce chemin.

À regarder

Vérifiez la gestion des exceptions autour de TTunnelLocal.Open et OpenSocket si des pairs non fiables peuvent fournir les clés du handshake.

API publique

  • TTunnelLocal.Openbehaviour-changed — Un échec de Ecc256r1SharedSecret lève maintenant ETunnel au lieu de sortir silencieusement.

Arnaud Bouchez · 16:53 UTC · voir le commit sur GitHub →

9 Moyenne Les applications peuvent confier un socket déjà connecté à TTunnelLocal mormot.net.tunnel expose TTunnelLocal.WaitForHandshake et ajoute TTunnelLocal.OpenSocket. OpenSocket valide un socket non nul et son port, transfère sa propriété en vidant la variable de l’appelant et partage l’initialisation du handshake avec Open via la méthode protégée OpenInternal. La documentation de ITunnelOpen décrit désormais une séquence à la demande de type SSH -R. Nouveautés mormot.net.tunnel c38c36da+158-44

net: introduced late access to the local Tunnel socket

Impact

Le transfert inverse de type VNC peut différer la connexion backend jusqu’à l’arrivée d’un véritable client local. Le contrat source des appels Open existants ne change pas ; après un appel OpenSocket valide, l’appelant ne doit ni fermer ni réutiliser Socket, car TTunnelLocal en a pris possession.

À regarder

Pour un transfert à la demande, testez la propriété du socket, les deux sens du handshake, le timeout et la fermeture distante avant de remplacer un flux fondé sur Open.

API publique

  • TTunnelLocal.WaitForHandshakeadded — Attend le premier handshake distant en file sans le consommer.
  • TTunnelLocal.OpenSocketadded — Démarre le tunnel sur un TNetSocket déjà connecté et en prend possession.

Arnaud Bouchez · 16:48 UTC · voir le commit sur GitHub →

10 Moyenne Un seul helper produit désormais chaque numéro de session imprévisible à neuf chiffres mormot.crypt.core ajoute la fonction publique Random9Digits. Elle prend trois cardinaux candidats depuis Random128, efface le buffer temporaire de 128 bits et retourne 100000000..999999999, ou zéro seulement si tous les candidats sont nuls. TTunnelRelay.PrepareNewSession dans mormot.net.tunnel appelle maintenant ce helper. Nouveautés mormot.crypt.core+1 da7e1c2f+23-11

crypt: new Random9Digits() function

Impact

Les identifiants de session Tunnel conservent leur représentation réseau sur 32 bits, mais ont toujours exactement neuf chiffres décimaux et utilisent le CSPRNG du framework. Le code Delphi/FPC peut réutiliser ce helper lorsque cette plage et le contrat zéro-en-cas-d’échec conviennent.

API publique

  • Random9Digitsadded — Retourne un cardinal imprévisible dans 100000000..999999999, ou zéro si Random128 est inutilisable.

Arnaud · 21:54 UTC · voir le commit sur GitHub →

11 Moyenne Delphi 10–10.3 reçoit des contournements ciblés pour les pointeurs et l’inlining mormot.defines.inc définit ISDELPHI10_103 pour les versions de compilateur 30 à 33. mormot.core.buffers désactive inline sur FromVarInt32 pour cette plage, et mormot.core.base réécrit les casts de pointeur typé dans AppendShortCurr64 de @p[index] vers une arithmétique de pointeur acceptée par ces compilateurs. Compilateur & plateforme mormot.core.base+1 92d840ee+10-6

core: circumvent Delphi 10.x compiler bugs

Impact

Les projets compilés avec Delphi 10, 10.1, 10.2 ou 10.3 évitent des défaillances connues du compilateur dans le décodage des entiers variables et le formatage texte des valeurs Currency. Le comportement généré reste identique ; FPC et les autres versions de Delphi n’utilisent pas cette condition.

Arnaud Bouchez · 07:41 UTC · voir le commit sur GitHub →

12 Faible TNetAddr reconnaît tout le bloc loopback IPv4 et IPv6 ::1 mormot.net.sock ajoute la méthode publique TNetAddr.IsLoopback. Elle retourne true pour toute adresse AF_INET dont le premier octet vaut 127 et pour le motif AF_INET6 ::1, et false pour les autres familles ou les adresses non définies. Nouveautés mormot.net.sock be380064+20-2

net: new TNetAddr.IsLoopback method

Impact

Le code réseau peut effectuer un contrôle local tenant compte de la famille au lieu de comparer seulement 127.0.0.1. Les appelants existants ne changent pas ; le chemin accept du Tunnel adopte ce helper dans un commit ultérieur.

API publique

  • TNetAddr.IsLoopbackadded — Retourne true pour les adresses 127.x.x.x et ::1.

Arnaud Bouchez · 13:19 UTC · voir le commit sur GitHub →

13 Faible CheckHash accepte les buffers bruts en plus des chaînes gérées mormot.core.test ajoute une surcharge TSynTestCase.CheckHash prenant data: pointer et len: PtrInt. La surcharge RawByteString existante lui délègue le travail, et l’implémentation commune calcule Hash32(data, len) avant de produire l’assertion de diagnostic. Nouveautés mormot.core.test 3ad5bbe2+13-4

core: new TSynTestCase.CheckHash() overload

Impact

Les tests peuvent valider des streams, des short strings et une zone mémoire quelconque sans allouer d’abord un RawByteString. Le runtime de production n’est pas affecté, car l’ajout se trouve dans l’unité de test.

API publique

  • TSynTestCase.CheckHash(pointer, PtrInt, cardinal, RawUtf8)added — La nouvelle surcharge calcule le hash d’un buffer mémoire et de sa longueur explicites.

Arnaud Bouchez · 09:33 UTC · voir le commit sur GitHub →

14 Faible Les parcours du relais et les copies du cache utilisent des boucles de pointeurs plus directes mormot.net.tunnel introduit PTunnelRelayConsole et réécrit HasConsolePrepared et ConsolesInfo pour avancer par pointeurs d’enregistrement. TTunnelList.GetAllInfo retire aussi des blocs try/finally autour de brèves affectations protégées, sans changer le verrou ni le comportement de sortie. Performance mormot.net.tunnel 89996223+28-28

net: slightly optimized TTunnelRelay process

Impact

L’énumération des métadonnées du relais effectue moins de calculs d’index et de cadres d’exception. Les résultats publics et la sémantique des verrous restent inchangés, donc aucune adaptation Delphi/FPC n’est nécessaire.

Arnaud Bouchez · 17:41 UTC · voir le commit sur GitHub →

15 Faible La destruction des threads FPC POSIX évite si possible l’attente fixe du RTL TThreadAbstract redéfinit Destroy uniquement sous FPCPOSIX. Lorsque le thread principal libère un thread actif non suspendu, il appelle Terminate puis boucle brièvement sur CheckSynchronize et SleepHiRes jusqu’à Finished ou 100 ms, avant d’appeler le destructeur hérité. Performance mormot.core.threads efc0950e+28-2

core: override TThreadAbstract.Destroy on FPC POSIX

Impact

Les objets thread FPC POSIX de courte durée peuvent finir avant que le chemin RTL hérité impose son attente WaitFor habituelle de 100 ms. Delphi et Windows ne compilent pas cette redéfinition.

API publique

  • TThreadAbstract.Destroybehaviour-changed — Sous FPC POSIX, les threads actifs reçoivent une boucle coopérative bornée avant la destruction héritée.

Arnaud Bouchez · 16:16 UTC · voir le commit sur GitHub →

16 Faible Le matcher interne des sections INI utilise une boucle adaptée à Delphi 10 IdemPChar2 dans mormot.core.fmt est réécrit : la boucle repeat avec un AnsiChar temporaire devient une boucle while qui compare directement table[up[PtrUInt(p)]] et n’avance up qu’en cas de correspondance. Compilateur & plateforme mormot.core.fmt 00f6828c+12-13

core: refactored INI parsing for Delphi 10.x

Impact

La comparaison normalisée des noms de section INI conserve le même comportement tout en évitant une forme de code problématique sous Delphi 10.x. Les API applicatives FPC et Delphi plus récents ne changent pas.

Arnaud Bouchez · 08:32 UTC · voir le commit sur GitHub →

17 Faible Les builds Windows Canary reçoivent les libellés actuels desktop et server mormot.core.os actualise ses tables de builds : la build desktop 29570 correspond à Windows 11 27H2, la build desktop 26300 reste 26H2 et la build server 29651 correspond à Windows Server 26H2. Le batch de test Delphi active aussi l’optimisation et NO_UI pour les compilateurs configurés non par défaut. Compilateur & plateforme mormot.core.os 61a6fc1b+12-9

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

Impact

OSVersionText peut afficher les bons libellés sur ces builds preview au lieu de retomber sur une catégorie plus ancienne. La sélection des fonctionnalités runtime ne change pas, car le diff modifie seulement des tables descriptives.

Arnaud Bouchez · 14:35 UTC · voir le commit sur GitHub →

18 Faible Les tests Windows FPC en ligne de commande désactivent explicitement les unités UI test/build_fpc.sh ajoute -dNO_UI pour les cibles win*, et test/build_winarm.bat ajoute la même définition pour aarch64-win64. Cela empêche mormot2tests d’exiger Lazarus Interfaces et test.ui.pdf lorsqu’aucun chemin de widgetset n’est configuré. Compilateur & plateforme 55d28b7f+4-2

tests: define NO_UI in the command line FPC build scripts

Impact

Le build de test du dépôt en ligne de commande fonctionne de nouveau sous FPC Windows et aarch64-win64 sans LCL. Les packages Lazarus conservent la couverture UI et les options des builds applicatifs ne changent pas.

Sven Harazim · 10:41 UTC · voir le commit sur GitHub →

19 Faible Les tunnels différés gagnent une couverture de bout en bout directe et WebSocket test.net.proto ajoute TunnelDeferred. Le test prépare les deux extrémités du relais, accepte un socket viewer avant de connecter le backend, attend le handshake, échange des bannières de type VNC dans les deux sens et répète le flux via des callbacks SOA sur WebSockets. Tests e22ca7df+186-2

tests: cover deferred Tunnel connection

Impact

Aucun code applicatif ne change. Le nouveau chemin TTunnelLocal à la demande est maintenant exercé sans sérialisation de transport puis via le véritable chemin de callback WebSocket.

Arnaud Bouchez · 18:18 UTC · voir le commit sur GitHub →

20 Faible Le projet de test Lazarus reconnaît dix classes d’exception attendues test/mormot2tests.lpi enregistre dix noms de classes d’exception, dont EHttpSocket, EYamlException, EStreamError et EJsonObjectDecoder, dans sa configuration du débogueur Lazarus. Tests 1b9767fa+34-2

test: ease mormot2tests debugging by registering some exceptions

Impact

Seul le traitement du débogueur dans le projet de test Lazarus change. Le code du framework, le comportement des tests hors débogage et les builds applicatifs restent inchangés.

Arnaud · 21:16 UTC · voir le commit sur GitHub →

21 Faible Les hash de régression signalent désormais systématiquement les valeurs attendues et obtenues Quatre unités de test remplacent les comparaisons directes de Hash32 par TSynTestCase.CheckHash. Les buffers pointeur-longueur, les variants sérialisés, le JSON SOA et la mémoire PDF générée utilisent la même assertion de diagnostic, avec les constantes PDF réécrites en hexadécimal. Tests 07032883+14-14

tests: use new CheckHash()

Impact

Les tests de régression en échec donnent un diagnostic de hash plus clair, notamment lorsque l’incorporation des polices PDF varie selon le système. Le runtime du framework et le code applicatif ne changent pas.

Arnaud Bouchez · 09:44 UTC · voir le commit sur GitHub →

22 Faible Les contrôles loopback utilisent désormais les helpers et constantes communs mormot.net.sock remplace deux usages du texte cLocalhost par IP4local. TTunnelLocalThread.DoExecute dans mormot.net.tunnel utilise TNetAddr.IsLoopback au lieu de comparer seulement fClientAddr.IP4 à cLocalhost32. Entretien mormot.net.sock+1 0ce4b076+5-5

net: minor loopback definitions usage

Impact

L’admission locale du Tunnel suit maintenant la définition loopback commune IPv4 et IPv6, donc ::1 est accepté comme local. Le comportement localhost IPv4 existant ne change pas.

Arnaud Bouchez · 16:42 UTC · voir le commit sur GitHub →

Activité upstream commits par jour · 60 derniers jours
Commits977
Jours actifs44/60
Plus chargé2026-09-30
Pic60
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