À regarderun correctif ou une fonctionnalité utileLe payload brut ne contient aucun marqueur superseded_by. La recommandation vise donc la tête de l’édition, qui réunit tous les changements Tunnel et évite la build intermédiaire manifestement incomplète 2.4.16768.
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.
22 sur 22 entrées · 23 commits upstream
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.
Unités
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.
Mise à jour recommandée
Mettez à niveau tout TTunnelRelay exposé au-delà d’une frontière entièrement fiable et prenez la build 2.4.16776 pour l’implémentation finalisée de Random9Digits.
API publique
TTunnelRelay.PrepareNewSessionbehaviour-changed — Les identifiants de session proviennent maintenant de Random128 plutôt que de NetRandom32.
Unités
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.
Mise à jour recommandée
Mettez à niveau les serveurs asynchrones dont plusieurs couches peuvent appeler Shutdown avant la destruction, puis testez les cycles démarrage-arrêt et le nettoyage après échec de démarrage.
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.
Mise à jour recommandée
Mettez à niveau les relais qui appellent GetAllInfo en concurrence ou exposent ConsolesInfo à plusieurs clients de supervision.
Unités
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.
Mise à jour recommandée
Prenez ce correctif pour les relais avec maintenance concurrente des sessions ou de très longues durées d’activité.
Unités
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.
Mise à jour recommandée
Prenez ce correctif avec la série complète WaitForHandshake/OpenSocket dans la build 2.4.16776 et testez la fermeture du pair pendant l’initialisation.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
Mise à jour recommandée
Les utilisateurs du relais Tunnel devraient passer à la build 2.4.16776 afin de prendre ensemble l’allocation imprévisible et son helper de plage final.
API publique
Random9Digitsadded — Retourne un cardinal imprévisible dans 100000000..999999999, ou zéro si Random128 est inutilisable.
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.
Mise à jour recommandée
Les équipes Delphi 10–10.3 devraient reconstruire les cibles concernées avec la build 2.4.16776 et relancer les tests de sérialisation et de formatage Currency.
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.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
Unités
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.
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.
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.
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.
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.