Agir maintenantpeut affecter un système en productionLes 27 commits non-merge de 2.4.17294 à 2.4.17324 ont été examinés : 779 ajouts et 316 suppressions hors version bookkeeping. Trois merges sont exclus. Le head upstream exact a été inspecté. Aucun superseded_by ; l’ordre vient des follow-ups inspectés sans plage à éviter.
Les deadlocks WebSocket sont éliminés, TLS et les logs d’exception se stabilisent
Le broadcast WebSocket async et le forwarding RTSP n’envoient plus sous un read lock de connexion, supprimant un deadlock lorsqu’un échec d’écriture retire le peer. SChannel traite désormais une fermeture ordonnée pendant l’envoi comme une connexion close et complète la couverture de renégociation TLS 1.3. L’interception des exceptions est aussi corrigée entre threads, sous Delphi Win32 et Delphi POSIX, tandis que la détection AVX-512 vérifie que l’OS sauvegarde réellement l’état ZMM.
En bref
- Visez la build 2.4.17324 au commit 05e40cd692d391efb62ed97f78f264867477e8e5.
- TWebSocketAsyncServer.WebSocketBroadcast et TPostConnection.OnRead ne deadlockent plus lorsqu’un send défaillant supprime une connexion.
- Les envois SChannel renvoient nrClosed lors d’une fermeture normale et la réception gère SEC_I_RENEGOTIATE sous TLS 1.3.
- Les exceptions concurrentes ne disparaissent plus, les doublons Delphi Win32 sont supprimés et Delphi POSIX gagne l’interception.
- IntelAvx512 devient une variable calculée au démarrage et filtrée par XCR0 ; cpuAVX512 identifie le support x86-64-v4 activé par l’OS.
- Le test WebSocket http.sys Windows de l’issue #418 est désactivé car il reste instable sous Windows 11.
Conseil de mise à jour
Visez la build 2.4.17324. Mettez à niveau si la production utilise TWebSocketAsyncServer.WebSocketBroadcast, le forwarding RTSP-over-HTTP, SChannel Windows, TTunnelLocal ou dépend de logs d’exception complets sous concurrence. Stressez les broadcasts avec reset client, les key updates TLS 1.3, la fermeture du peer et ClosePort pendant WaitForHandshake. Aucun superseded_by n’étaye une plage à éviter ; prenez chaque série entière. Surveillez séparément l’issue #418 dont le test WebSocket http.sys Windows est désactivé.
27 sur 27 entrées · 30 commits upstream
1
Élevée
Les broadcasts WebSocket utilisent des snapshots sûrs pour les deux modes de timeout
GetConnectionHandles et GetConnectionInstances parcourent le vrai tableau de références. WebSocketBroadcast utilise les instances avec timeout zéro, les handles pour les sends bloquants et vérifie ConnectionFind avant SendDirect.
Correctifs
mormot.net.async+1
f253c603+53-40
net: properly fixed #629
Impact
Le broadcast vers des peers fermés concurremment ne risque plus deadlock ni nil dereference, et les broadcasts non bloquants évitent les recherches répétées.
Mise à jour recommandée
Mettez à niveau et stressez les broadcasts avec aTimeOut nul et non nul pendant les resets ou déconnexions clients.
API publique
TWebSocketAsyncServer.WebSocketBroadcastbehaviour-changed
2
Élevée
SChannel poursuit le handshake lors des key updates TLS 1.3
TSChannelNetTls.Receive reconnaît SEC_I_RENEGOTIATE et renvoie l’entrée restante à HandshakeStep. Le client de test peut demander SSL_key_update en cours de transfert et TBuffer32K est ajouté.
Correctifs
mormot.core.base+3
8e6133ef+56-26
net: SChannel fixes and new tests about TLS 1.3 renegotiation
Impact
Les connexions SChannel TLS 1.3 longues survivent aux key updates du peer au lieu d’échouer après SEC_I_RENEGOTIATE.
Mise à jour recommandée
Testez les transferts TLS 1.3 longs et un key update initié par le peer sous Windows 11.
API publique
TBuffer32Kadded
3
Élevée
La fermeture socket SChannel est signalée sans exception de shutdown
NetErrorFromSystem mappe WSAENOTCONN et WSAESHUTDOWN vers nrClosed. TSChannelNetTls.SendRawAll renvoie TNetResult, les appelants s’arrêtent à la fermeture et les erreurs receive incluent le résultat normalisé.
Correctifs
mormot.net.sock+1
2d800eaa+46-26
net: several fixes to SChannel socket closure
Impact
Le teardown TLS Windows normal n’apparaît plus comme une erreur ESChannel fatale, y compris pendant l’envoi de tokens de handshake ou de sortie chiffrée.
Mise à jour recommandée
Retestez les déconnexions client pendant le handshake SChannel, les grandes écritures et le shutdown serveur.
API publique
NetErrorFromSystembehaviour-changed
4
Élevée
Le broadcast WebSocket libère le read lock avant d’écrire
WebSocketBroadcast copie les handles sous ConnectionLock.ReadOnlyLock, le libère puis encode et envoie via ConnectionFind. La documentation avertit que Write peut appeler ConnectionDelete et ne doit pas tourner sous read lock.
Correctifs
mormot.net.async+1
fd8b176f+25-15
net: fixed TWebSocketAsyncServer.WebSocketBroadcast deadlock when a send fails
Impact
Un send de broadcast défaillant peut supprimer sa connexion sans tenter d’upgrader un read lock et bloquer le serveur. Les commits suivants finalisent nil et lifetime.
5
Élevée
Les exceptions concurrentes ne disparaissent plus de TSynLog
Les handlers cessent de mettre le callback global _RawLogException à nil pendant chaque log. La récursion reste bloquée par thread via PerThreadInfo.ExceptionIgnore, donc les autres threads conservent leur handler.
Correctifs
mormot.core.os+1
6b486e00+18-17
core: fixed Exception diseappearing in logs on multi-thread process :(
Impact
Les exceptions levées simultanément sur plusieurs threads ne sont plus omises silencieusement. Les services Delphi/FPC concurrents sont concernés.
Mise à jour recommandée
Générez des exceptions traitées simultanées sur des workers et vérifiez que chacune apparaît exactement une fois dans TSynLog.
Unités
6
Élevée
Les clients WebSocket et tunnels locaux publient sûrement leur état de shutdown
TTunnelLocal.ClosePort définit fClosed tant que fSendSafe est verrouillé, THttpClientWebSockets.Destroy utilise FreeAndNilSafe et les callbacks prennent fProtocol.ConnectionFlags directement.
Correctifs
mormot.net.tunnel+1
b60779e1+5-5
net: hardened THttpClientWebSockets shutdown
Impact
Les senders du tunnel et observers WaitForHandshake voient la fermeture dans un ordre cohérent, et la destruction du client WebSocket est plus sûre sous callbacks concurrents.
Mise à jour recommandée
Testez ClosePort pendant WaitForHandshake et détruisez les clients WebSocket pendant des callbacks actifs.
7
Élevée
Une fermeture SChannel normale pendant l’envoi renvoie désormais nrClosed
TSChannelNetTls.SendRawAll initialise le résultat à nrClosed avant de traiter un send nul, afin qu’une fermeture ordonnée sorte sans lever ESChannel.
Correctifs
mormot.net.sock.windows
1a03af2e+5-4
net: fixed graceful disconnection during SChannel sending
Impact
Les clients et serveurs TLS Windows peuvent fermer pendant un send en attente sans transformer un shutdown normal en exception.
Mise à jour recommandée
Mettez à niveau et testez le shutdown du peer pendant l’envoi de grandes requêtes ou réponses SChannel.
Unités
8
Élevée
Le forwarding RTSP-over-HTTP n’écrit plus sous ConnectionLock
TPostConnection.OnRead remplace ConnectionFindAndLock(cReadOnly) par ConnectionFind avant WriteString, car un échec d’écriture peut appeler ConnectionDelete et demander le même lock en écriture.
Correctifs
mormot.net.rtsphttp
a1c8844a+3-4
net: fixed TPostConnection.OnRead holding ConnectionLock during WriteString()
Impact
Le forwarding POST RTSP-over-HTTP ne se deadlocke plus si la connexion RTSP associée disparaît pendant l’écriture.
Mise à jour recommandée
Stressez des clients RTSP-over-HTTP qui se déconnectent pendant le forwarding des commandes POST.
Unités
9
Moyenne
Delphi moderne utilise un seul hook sans records d’exception dupliqués
SynRaiseProc est généralisé pour RaiseExceptObjProc, les handlers Windows ignorent les exceptions Delphi déjà traitées, les faux codes RTL sont filtrés et les handlers d’origine restent chaînés.
Correctifs
mormot.core.os
b6de95bf+56-40
core: refined Delphi exception logging
Impact
Les exceptions Delphi sont loguées une seule fois tout en conservant les hooks RTL et tiers. Le routage Windows/POSIX devient cohérent.
Mise à jour recommandée
Mettez à niveau si l’interception TSynLog est active, puis comparez les compteurs mono-thread et multi-thread.
Unités
10
Moyenne
Les exceptions Delphi Win32 ne sont plus loguées deux fois
Delphi 2009+ Win32 installe RaiseExceptObjProc pour les exceptions du langage et fait ignorer par RTLUnwindProc les records cRtlException déjà traités.
Correctifs
mormot.core.os
0a512f58+51-23
core: fixed duplicate Exception logging on Delphi Win32
Impact
TSynLog n’émet plus de doublons pour les exceptions Delphi Win32 ordinaires ; les anciens Delphi et FPC gardent leurs hooks.
Mise à jour recommandée
Comparez les compteurs Win32 avant et après mise à niveau si les alertes supposent un record par exception.
Unités
11
Moyenne
Les logs d’exception tolèrent une adresse d’instruction inconnue
SynLogException omet le champ pointeur 'at' lorsque TSynLogExceptionContext.EAddr vaut zéro et utilise des writes sûrs avant les frames disponibles.
Correctifs
mormot.core.log
128e7134+11-6
core: fixed SynLogException() with Ctxt.EAddr = 0
Impact
Les records d’exception Delphi LLVM sans adresse fiable restent bien formés et conservent la stack disponible.
Unités
12
Moyenne
Les timeouts RSA par défaut évoluent avec la taille de clé
TRsa.Generate multiplie RSA_DEFAULT_GENERATION_TIMEOUTMS par 4 pour 3072 bits, 16 pour 4096 bits et 64 pour 7680/8192 bits, sans modifier les timeouts explicites.
Correctifs
mormot.crypt.rsa
ad2f17e3+10-3
crypt: RSA generation timeout auto adaptation
Impact
Les CPU faibles risquent moins de renvoyer rgrTimeout pour de grandes clés avec les défauts. Les TimeOutMS explicites restent inchangés.
À regarder
Revoyez les budgets de latence pour 3072 bits et plus ; fixez TimeOutMS explicitement si le nouveau défaut est trop long.
API publique
TRsa.Generatebehaviour-changed
Unités
13
Moyenne
TTunnelLocal marque la fermeture avant de réveiller WaitForHandshake
TTunnelLocal.ClosePort et le chemin remote-close définissent fClosed avant de signaler fHandshakeEvent, empêchant WaitForHandshake de voir l’ancien état ouvert.
Correctifs
mormot.net.tunnel
e7c2a1fb+6-6
net: hardened TTunnelLocal.ClosePort
Impact
Les waiters voient un état closed cohérent. Le commit suivant déplace l’affectation sous le send lock pour finaliser la synchronisation.
Unités
14
Moyenne
Les owners async peuvent capturer les handles ou instances actifs
TAsyncConnections ajoute les méthodes publiques GetConnectionHandles et GetConnectionInstances, qui copient les connexions non fermées sous ConnectionLock.ReadOnlyLock.
Nouveautés
mormot.net.async
40766691+61-2
net: new TAsyncConnections.GetConnectionInstances/GetConnectionHandles methods
Impact
Le code async personnalisé gagne des API de snapshot plus sûres. Les instances ne sont protégées du recyclage que pendant KeepConnectionInstanceMS et ne conviennent pas au travail bloquant.
À regarder
Préférez les handles pour le travail différé ou bloquant ; utilisez les instances uniquement pour une opération immédiate non bloquante.
API publique
TAsyncConnections.GetConnectionHandlesaddedTAsyncConnections.GetConnectionInstancesadded
Unités
15
Moyenne
La détection AVX-512 vérifie l’état ZMM géré par l’OS
mormot.core.base ajoute l’assembleur IsZmmOSEnabled, des constantes de features AVX-512, le filtre IntelAvx512 via XCR0 et cpuAVX512 dans TX64CpuFeatures pour x86-64-v4.
Nouveautés
mormot.core.base+1
6941a143+56-2
core: introducing IntelAvx512 to detect AVX-512 support enabled by the OS
Impact
Le dispatch peut éviter AVX-512 lorsque CPUID l’annonce mais qu’un ancien OS ou une VM ne sauvegarde pas opmask/ZMM, empêchant les fautes #UD.
À regarder
Utilisez IntelAvx512 ou cpuAVX512 plutôt que CpuFeatures brut avant un dispatch EVEX personnalisé, surtout en VM.
API publique
CPUAVX512FEATURESaddedCPUAVX512X64V4addedIntelAvx512addedcpuAVX512added
16
Moyenne
Le wrapper OpenSSL expose les key updates TLS 1.3
mormot.lib.openssl11 ajoute SSL_KEY_UPDATE_NOT_REQUESTED, SSL_KEY_UPDATE_REQUESTED et la fonction optionnelle SSL_key_update aux bindings dynamiques et statiques.
Nouveautés
mormot.lib.openssl11
8f4fd5a1+28-14
lib: new SSL_key_update() OpenSSL function wrapper
Impact
Les utilisateurs OpenSSL bas niveau peuvent demander une rotation de clé TLS 1.3. Les anciennes bibliothèques continuent de charger car le symbole est optionnel.
API publique
SSL_key_updateaddedSSL_KEY_UPDATE_NOT_REQUESTEDaddedSSL_KEY_UPDATE_REQUESTEDadded
Unités
17
Moyenne
Delphi POSIX gagne un logging automatique préliminaire des exceptions
mormot.defines.inc active l’interception sous Delphi POSIX et mormot.core.os.posix sélectionne RaiseExceptObjProc au lieu du hook FPC RaiseProc.
Nouveautés
mormot.core.os+1
e2798199+11-6
core: preliminary exception logging on Delphi POSIX
Impact
Les builds Delphi Linux et POSIX mobile peuvent produire des records TSynLog automatiques là où aucun intercepteur n’existait. FPC ne change pas.
À regarder
Vérifiez le volume des logs et le format des stacks sur chaque cible Delphi POSIX avant production.
API publique
RawExceptionInterceptbehaviour-changed
Unités
18
Faible
La disponibilité AVX-512 est calculée une fois au démarrage
La fonction publique IntelAvx512 sans argument devient un global TIntelCpuFeatures rempli par TestCpuFeatures, évitant les appels XGETBV répétés tout en gardant le filtre XCR0.
Performance
mormot.core.base
fb734823+14-18
core: IntelAvx512 is now a global variable pre-computed at startup
Impact
Les checks deviennent une lecture de variable. Les expressions Pascal restent naturelles, mais le code prenant explicitement l’adresse de la fonction doit changer.
À regarder
Recherchez seulement le code bas niveau qui stocke ou passe le pointeur de fonction IntelAvx512 ; les checks de valeur ne changent pas.
API publique
IntelAvx512signature-changed — La fonction introduite dans la même édition devient une variable globale précalculée.
Unités
19
Faible
L’interception Delphi est conditionnée par la disponibilité réelle du RTL
L’include POSIX ne définit WITH_RAISEEXCEPTOBJPROC que si HASRAISEEXCEPTOBJPROC est disponible ; les autres changements clarifient les filtres de stack et commentaires.
Compilateur & plateforme
mormot.core.log+3
3327833c+17-15
core: some minor fixes
Impact
Les anciennes cibles Delphi évitent de compiler contre un hook indisponible. Le comportement FPC et Delphi moderne reste inchangé.
20
Faible
Les tests mTLS diffusent de grands bodies sur de nombreux records TLS
test.net.proto ajoute une route POST volumineuse, des envois client par chunks, une vérification CRC32C et des cas TLS 1.2/1.3 pour SChannel et OpenSSL.
Tests
test.net.proto
9a5d0e77+105-28
test: cover huge content with mTLS
Impact
La couverture traverse désormais les limites de records et les gros payloads mTLS ; aucune API applicative ne change.
Unités
21
Faible
Un test avec peer reset reproduit le deadlock de broadcast WebSocket
TNetworkProtocols ajoute un serveur, un worker de broadcast et 50 clients éphémères fermant avec frames non lues et RST ; l’échec de la connexion suivante révèle le blocage.
Tests
test.net.proto
c0f6defb+83-0
test: new TNetworkProtocols._TWebSocketAsyncServer regression test
Impact
Le test capture l’issue #629 sans changer le comportement de production.
Unités
22
Faible
Les workers de test mTLS capturent correctement les exceptions réseau
Le runner SChannel/OpenSSL enveloppe chaque worker, logue la classe levée, accepte ENetSock comme échec réseau attendu et donne un nom distinct à chaque serveur async.
Tests
mormot.core.log+1
cc95a9eb+28-14
test: hardened error catching for SChannel/OpenSSL mTLS
Impact
Les échecs de régression TLS deviennent diagnosticables sans changer le comportement runtime applicatif.
23
Faible
La régression du deadlock WebSocket rejoint la suite multithread
La régression de l’issue #629 passe dans SlowTests, utilise TLoggedThread et tourne avec les autres tests réseau en arrière-plan sous /multithread.
Tests
test.net.proto
bb3be0ae+23-16
tests: fixed #629 coverage
Impact
Seuls l’ordonnancement des tests et les diagnostics changent ; le code de production n’est pas concerné.
Unités
24
Faible
Le stress test de broadcast WebSocket démarre après la première connexion
Le thread de régression démarre après la première connexion réussie, alterne les sends à 0 et 50 ms, conserve un compteur local et évite de le déréférencer si le shutdown se bloque.
Tests
test.net.proto
9a417d31+21-15
test: fixed WS broadcast thread synchronization
Impact
Seul le harnais de régression change ; le code et les API Delphi/FPC de production ne changent pas.
Unités
25
Faible
La régression broadcast alterne sends bloquants et non bloquants
Le test WebSocket déplace le compteur hors du worker et alterne aTimeOut entre zéro et 50 ms pendant les connexions et resets répétés.
Tests
test.net.proto
0eadadb7+22-7
test: enhanced WS broadcast process
Impact
La couverture exerce les deux chemins de snapshot de WebSocketBroadcast ; le comportement applicatif ne change pas.
Unités
26
Faible
Le test WebSocket http.sys Windows est temporairement désactivé
TNetworkProtocols._HttpApiWebSocketServer quitte immédiatement, désactivant la couverture de l’issue #418 car le test est jugé instable, surtout sous Windows 11.
Tests
test.net.proto
05e40cd6+3-2
tests: disable issue #418 coverage
Impact
Le comportement applicatif ne change pas, mais la CI ne détecte plus les régressions de ce scénario WebSocket http.sys Windows.
Unités
27
Faible
Les commentaires LDAP et WebSocket sont clarifiés sans changement runtime
Les commentaires autour de CldapBroadcast, des globals AVX-512 et du tri des IDs WebSocket sont corrigés ; les instructions exécutables ne changent pas.
Documentation
mormot.core.base+2
d3366efd+6-6
net: minor fixes
Impact
Aucun impact sur le code applicatif Delphi/FPC ni sur le comportement runtime.