mORMot2 DailyLecture quotidienne des commits upstream

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é.

Build2.4.17293 → 2.4.17324
Commits30
Lignes+992 -386
Lecture6 min

27 sur 27 entrées · 30 commits upstream

Sujets
# Entrée Catégorie Unités
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.

API publique

  • TWebSocketAsyncServer.WebSocketBroadcastbehaviour-changed

Arnaud Bouchez · 14:12 UTC · PR #629 · voir le commit sur GitHub →

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.

API publique

  • TBuffer32Kadded

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

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.

API publique

  • NetErrorFromSystembehaviour-changed

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

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.

je · 09:21 UTC · voir le commit sur GitHub →

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.

Arnaud Bouchez · 10:05 UTC · voir le commit sur GitHub →

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.

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

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.

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

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.

je · 09:21 UTC · voir le commit sur GitHub →

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.

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

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.

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

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.

Arnaud Bouchez · 12:06 UTC · voir le commit sur GitHub →

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

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

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.

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

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.GetConnectionHandlesadded
  • TAsyncConnections.GetConnectionInstancesadded

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

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

  • CPUAVX512FEATURESadded
  • CPUAVX512X64V4added
  • IntelAvx512added
  • cpuAVX512added

Dimitris Kounalakis · 04:03 UTC · voir le commit sur GitHub →

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_updateadded
  • SSL_KEY_UPDATE_NOT_REQUESTEDadded
  • SSL_KEY_UPDATE_REQUESTEDadded

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

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

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

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.

Dimitris Kounalakis · 13:41 UTC · voir le commit sur GitHub →

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é.

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

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.

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

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.

je · 09:21 UTC · voir le commit sur GitHub →

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.

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

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é.

Arnaud Bouchez · 14:13 UTC · PR #629 · voir le commit sur GitHub →

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.

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

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.

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

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.

Arnaud Bouchez · 18:10 UTC · PR #418 · voir le commit sur GitHub →

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.

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