mORMot2 DailyLecture quotidienne des commits upstream

L’authentification AES-GCM revient, Tunnel et les files sont reconstruits

Le correctif le plus urgent restaure la vérification GMAC dans le chemin AVX de déchiffrement AES-GCM, qui pouvait accepter un ciphertext, un tag ou des associated data falsifiés sur les systèmes x86-64 éligibles. Le cycle de vie, le handshake et l’arrêt de Tunnel sont reconstruits pour sortir les appels externes des verrous et donner au propriétaire un contrôle déterministe du thread. Les attentes des files et thread pools gagnent les futex OS et de nouvelles API, puis les correctifs requis pour Delphi, Win8+ et Linux.

En bref

  • Visez la build 2.4.17356 au commit 1f7febd219f9cb54175a1f87620e6862e4e670b8.
  • TAesGcmEngine.Decrypt vérifie désormais GMAC après le chemin AVX single-pass ; les tests rejettent ciphertext, tags et AAD falsifiés.
  • TTunnelLocal possède et joint son worker, transfère explicitement les sockets et exécute les callbacks de relay hors du state lock.
  • TSynQueue utilise les futex OS disponibles et ajoute WaitPopReset et Waiters ; les attentes comparées gardent leur polling.
  • TSynThreadTasks, PendingTasks et WaitFor ajoutent l’exécution gérée et l’attente de fin ; les correctifs finaux couvrent Delphi, Win8+ et Linux.
  • Les data descriptors ZIP en mémoire, la finalisation des callbacks REST WebSocket et le démarrage THttpApiServer sont réparés.

Conseil de mise à jour

Prenez la build complète 2.4.17356. Mettez à jour rapidement si AES-GCM peut utiliser le chemin AVX x86-64, si Tunnel ou les clients REST WebSocket s’arrêtent en concurrence, ou si THttpApiServer est utilisé. Retestez les entrées AES-GCM falsifiées, les cycles Tunnel open/close, queue finalize/reset, les timeouts WaitFor et le démarrage HTTP.sys. Aucun superseded_by n’est présent : aucune plage formelle n’est déclarée et les commits Tunnel ou WaitFor intermédiaires ne doivent pas être isolés.

Build2.4.17324 → 2.4.17356
Commits32
Lignes+2144 -1228
Lecture7 min

30 sur 30 entrées · 32 commits upstream

Sujets
# Entrée Catégorie Unités
1 Critique Le déchiffrement AVX AES-GCM n’accepte plus de données non authentifiées TAesGcmEngine.Decrypt déplace la comparaison finale du tag après tous les chemins single-pass, dont AvxProcess. Le chemin dual-pass marque le tag déjà vérifié pour éviter un double check. Sécurité mormot.crypt.core 3c395af5+13-11

crypt: fixed missing GMAC check in TAesGcmEngine.Decrypt() AVX path

Impact

Sur les systèmes x86-64 utilisant le chemin AVX AES-GCM, ciphertext, tag ou AAD falsifiés pouvaient auparavant réussir. Les chemins scalar et dual-pass authentifiaient déjà.

API publique

  • TAesGcmEngine.Decryptbehaviour-changed

je · 11:40 UTC · voir le commit sur GitHub →

2 Élevée Le transfert socket et les frames retardées Tunnel deviennent race-safe OpenInternal prend le socket par var, le vide après transfert au thread, vérifie la fermeture sous state lock et draine les frames handshake hors lock via RelayFrame. Correctifs mormot.core.threads+1 1f37f3a4+111-82

net: fixed several races in mormot.net.tunnel

Impact

Open et OpenSocket évitent le double-close des sockets transférés, et les callbacks des frames retardées ne réentrent plus sous le state lock. Les correctifs suivants terminent la séquence.

API publique

  • TTunnelLocal.OpenSocketbehaviour-changed

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

3 Élevée L’attente handshake et la fermeture Tunnel stabilisent leur modèle de lock TTunnelLocal remplace son lock réentrant par TOSLightLock, l’initialise/finalise explicitement, centralise l’état WaitForHandshake et ferme les handshakes échoués après création du thread via ClosePort. Correctifs mormot.net.tunnel+1 0900c1f2+75-68

net: still some fixes to mormot Tunnel

Impact

L’arrivée concurrente du handshake, timeout, fermeture et destruction ne dépendent plus d’un lock récursif ni d’events nil. Le code final touche Delphi et FPC sur toutes les plateformes Tunnel.

API publique

  • TTunnelLocal.WaitForHandshakebehaviour-changed
  • TTunnelLocal.ClosePortbehaviour-changed

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

4 Élevée Les appels transport Tunnel sortent du state lock parent Le lock parent devient fStateSafe, SendFrame capture compteurs et closed state sous lock, puis TTunnelLocalThread passe par ce helper avant ITunnelTransmit.TunnelSend hors lock. Correctifs mormot.net.tunnel 7d9ec6c6+62-45

net: fixed TunnelSend() call

Impact

Une implémentation transport peut bloquer ou réentrer sans deadlocker les transitions Tunnel. Cette forme intermédiaire est remplacée ensuite par TOSLightLock.

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

5 Élevée Les lecteurs ZIP en mémoire extraient la dernière entrée data-descriptor TZipRead.Create fait pointer la dernière entrée locale en mémoire vers le central directory suivant. SearchFromDataDescriptor cherche en arrière sans passer par le chemin disque ni déréférencer fSource=nil. Correctifs mormot.core.zip+1 444fc47e+98-0

core: TZipRead in-memory access to a last entry with data descriptor

Impact

L’ouverture d’un ZIP entièrement en mémoire ne lève plus EAccessViolation si la dernière entrée utilise FLAG_DATADESCRIPTOR, comme les .xlsx et .ods de LibreOffice.

API publique

  • TZipRead.Createbehaviour-changed

tf · 19:41 UTC · voir le commit sur GitHub →

6 Élevée Les workers Tunnel sont possédés et joints par leur parent TTunnelLocalThread abandonne FreeOnTerminate et la référence forte transmit. TTunnelLocal publie un worker suspendu, le démarre explicitement, le termine dans ClosePort et le libère dans le destructeur parent après join. Correctifs mormot.net.tunnel be0c7136+42-35

net: fixed TTunnelLocalThread lifetime

Impact

Le cycle worker ne race plus la destruction du parent et ne vide plus sa référence depuis le worker. Les commits suivants restent requis pour les appels externes et handshake.

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

7 Élevée Le forwarding Tunnel ne garde plus son state lock pendant le travail externe TunnelSend utilise le lock seulement pour les transitions handshake/flags puis forward les frames hors lock. ClosePort capture l’état sous lock avant d’interrompre les sockets et appeler le transport. Correctifs mormot.net.tunnel bd4626d4+34-36

net: fixed Tunnel process thread safety

Impact

Les callbacks transport, shutdown socket et livraison de frames ne peuvent plus deadlocker en réentrant TTunnelLocal sous state lock. Les commits suivants affinent encore ownership.

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

8 Élevée WaitFor se réveille à la fin des tâches sous Win8+ et Linux TSynThreadPool ajoute fWaiters autour de l’attente futex et TaskAllDone appelle OsWakeAllOnValue quand la dernière tâche se termine. Correctifs mormot.core.threads b7a92cc1+29-18

core: fixed TSynThreadPool.WaitFor on Win8+ and Linux

Impact

Le nouveau WaitFor ne dépend plus de l’expiration du timeout après passage du compteur à zéro sur les plateformes futex. Le commit suivant précise encore le cycle du compteur.

API publique

  • TSynThreadPool.WaitForbehaviour-changed

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

9 Élevée Les waiters de thread pool suivent désormais le cycle futex TSynThreadPool.WaitFor incrémente fWaiters avant de calculer sa deadline et garde le compteur sur la boucle exacte. TaskAllDone s’en sert pour décider d’appeler OsWakeAllOnValue. Correctifs mormot.core.threads fc943be2+8-8

core: tied up TSynThreadPool.WaitFor futex

Impact

Les appelants Win8+ et Linux attendant la fin de tout le travail évitent une fenêtre de wake-up perdu. Les autres plateformes gardent la boucle de secours d’une milliseconde.

API publique

  • TSynThreadPool.WaitForbehaviour-changed

Arnaud · 00:50 UTC · voir le commit sur GitHub →

10 Élevée Les serveurs HTTP.sys redémarrent automatiquement après construction THttpApiServer.Create n’ajoute plus hsoCreateSuspended avant THttpServerGeneric.Create. La classe de base peut définir fStartAfterConstruction et démarrer le server thread après la chaîne de construction. Correctifs mormot.net.server 1f7febd2+5-6

net: fixed THttpApiServer.Create startup

Impact

Les backends Windows HTTP.sys créés avec les options par défaut ne restent plus suspendus après l’initialisation. Les serveurs socket Delphi et FPC ne suivent pas ce chemin.

API publique

  • THttpApiServer.Createbehaviour-changed

Arnaud · 01:03 UTC · voir le commit sur GitHub →

11 Élevée Les callbacks REST WebSocket sont libérés avant leur owner TRestClientUri.Destroy déplace FreeAndNilSafe(fFakeCallbacks) dans le finally interne juste après InternalClose et avant inherited Destroy qui libère le modèle REST et les services. Correctifs mormot.rest.client 376e6934+5-5

rest: fixed TRestClientUri WebSockets callbacks finalization

Impact

Le shutdown WebSocket concurrent ne laisse plus le stockage callback référencer un owner déjà détruit. Le correctif touche les clients REST Delphi et FPC avec callbacks WebSocket.

API publique

  • TRestClientUri.Destroybehaviour-changed

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

12 Moyenne Le futex de queue se limite aux vrais consommateurs non filtrés TSynQueue évite les attentes futex pour PopEquals et WaitPeekLocked, conserve leur polling, empêche une séquence zéro après overflow et reset la séquence après chargement binaire. Correctifs mormot.core.threads 53ff22a2+32-21

core: some TSynQueue fixes and enhancements

Impact

Les attentes filtrées ne dorment pas indéfiniment devant un item non correspondant, tandis que WaitPop ordinaire garde le blocking OS efficace.

API publique

  • TSynQueue.WaitPopbehaviour-changed
  • TSynQueue.WaitPeekLockedbehaviour-changed

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

13 Moyenne Un task pool simple possédant ses objets rejoint les primitives thread TSynThreadTask définit DoExecute et TSynThreadTasks exécute ces objets via TSynThreadPool. Add prend toujours ownership, libère les tâches refusées et utilise TaskAbort au shutdown. Nouveautés mormot.core.threads+1 27d2e21b+77-5

core: new TSynThreadTasks simple thread-pool class

Impact

Les applications Delphi et FPC peuvent soumettre des objets task possédés sans écrire le plumbing worker. L’appelant ne doit jamais libérer une tâche passée à Add, même si Add renvoie false.

À regarder

Pour adopter TSynThreadTasks, supprimez les Free côté appelant après Add et implémentez DoExecute sans réutiliser la tâche.

API publique

  • TSynThreadTaskadded
  • TSynThreadTasksadded

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

14 Moyenne Les thread pools exposent le travail total et un hook final TSynThreadPool suit le travail queued et executing dans fPendingTasks, publie PendingTasks et appelle le virtual protégé TaskAllDone quand le compteur atteint zéro après exécution ou abort. Nouveautés mormot.core.threads f54b3fa0+47-20

core: new TSynThreadPool.PendingTask property

Impact

Le monitoring distingue les contexts queued de tout le travail restant, et les descendants peuvent réagir quand le pool devient idle. Le compteur couvre IOCP et POSIX.

À regarder

Examinez les descendants TSynThreadPool nécessitant une notification idle et utilisez la sémantique finale de 2.4.17356.

API publique

  • TSynThreadPool.PendingTasksadded
  • TSynThreadPool.TaskAllDoneadded

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

15 Moyenne Les checks d’accélération crypto deviennent des API runtime TX64CpuFeatures gagne cpuAESGCM, calculé depuis CLMUL, SSE4.1 et AES-NI. HasAesGcmAvx et HasKeccakAvx2 tiennent aussi compte de DisabledAsm. Nouveautés mormot.core.base+1 7ee3b216+34-12

core: introducing cpuAESGCM and other crypto HW test functions

Impact

Le code Delphi et FPC x86-64 peut interroger la même décision de dispatch que le moteur crypto sans dupliquer les tests CPU.

À regarder

Utilisez HasAesGcmAvx ou HasKeccakAvx2 pour que diagnostics et tests suivent le dispatch runtime réel.

API publique

  • cpuAESGCMadded
  • HasAesGcmAvxadded
  • HasKeccakAvx2added

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

16 Moyenne Les queues finalisées peuvent être réactivées et compter leurs waiters TSynQueue.WaitPopReset efface le flag destroying seulement après le désenregistrement de tous les anciens WaitPop. TSynQueue.Waiters renvoie le nombre protégé de waiters. Nouveautés mormot.core.threads 808c57b2+35-3

core: new TSynQueue.WaitPopReset/Waiters methods

Impact

Une queue arrêtée par WaitPopFinalize peut être réutilisée sans réallouer les items si reset réussit. Le monitoring peut lire les consommateurs actifs sûrement.

À regarder

Appelez WaitPopReset seulement après le retour de WaitPopFinalize et gérez false si un ancien waiter se termine encore.

API publique

  • TSynQueue.WaitPopResetadded
  • TSynQueue.Waitersadded

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

17 Moyenne Les thread pools peuvent attendre la fin de toutes les tâches acceptées TSynThreadPool.WaitFor surveille PendingTasks jusqu’à zéro via OsWaitOnValue si disponible, sinon un court sleep. Les timeouts finis et INFINITE sont supportés. Nouveautés mormot.core.threads c7512a04+34-2

core: new TSynThreadPool.WaitFor method

Impact

Les applications gagnent une barrière de fin pour le travail accepté. Cette première implémentation exige les trois correctifs suivants et ne doit pas être isolée.

API publique

  • TSynThreadPool.WaitForadded

Arnaud Bouchez · 20:02 UTC · voir le commit sur GitHub →

18 Moyenne Les consommateurs de queue bloquent sur les primitives OS natives TSynQueue ajoute un sequence counter et utilise OsWaitOnValue, OsWakeOnValue et OsWakeAllOnValue sous Win8+ et Linux. Push réveille un consommateur ; finalization et binary load réveillent tous. Performance mormot.core.threads+1 ac7c87e4+71-27

core: rewritten TSynQueue to use the OS futex if possible

Impact

WaitPop ordinaire ne spin plus au repos sur les systèmes supportés, réduisant CPU et latence. Les autres plateformes gardent SleepStep.

API publique

  • TSynQueue.WaitPopbehaviour-changed

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

19 Moyenne WaitFor devient visible pour les builds Delphi IOCP La déclaration TSynThreadPool.WaitFor sort de la section conditionnelle non-IOCP, rejoint son implémentation et permet la compilation Delphi Windows. Compilateur & plateforme mormot.core.threads+1 5541a4f1+5-6

core: fixed Delphi compilation

Impact

Les builds intermédiaires avec la nouvelle méthode pouvaient échouer sous Windows IOCP. Les déclarations FPC et non-IOCP étaient déjà visibles.

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

20 Moyenne L’état de fermeture Tunnel rejoint un seul ensemble de flags protégé Le boolean fClosed rejoint TTunnelLocalFlags, et le traitement des frames sépare capture d’état handshake et RelayFrame. CallbackReleased appelle directement ClosePort(FromNotify=true). Sous le capot mormot.net.tunnel d60cc6e8+46-48

net: internal Tunnel flags refactoring

Impact

L’état de fermeture devient atomique avec les autres flags protégés et la notification distante idempotente. C’est un refactor intermédiaire suivi d’autres fixes.

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

21 Faible Les échecs de test gagnent un helper conscient des exceptions TSynTestCase.FailedRaised formate une Exception via ObjectToJsonDebug avant TestFailed. Le filtrage des symbols retire aussi les frames de redirection mormot.core.log et mormot.core.test. Nouveautés mormot.core.log+2 311e29ed+45-36

core: introducing TSynTestCase.FailedRaised method

Impact

Les suites de tests mORMot custom peuvent rapporter les exceptions de manière cohérente avec des locations plus propres. Le runtime de production ne change pas.

API publique

  • TSynTestCase.FailedRaisedadded

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

22 Faible Les incréments atomiques internes utilisent un helper unique Quatre appels InterlockedIncrement dans les séquences, comptes thread pool, références ECC et tests sont remplacés par LockedInc32 avec adresses explicites. Compilateur & plateforme mormot.core.base+3 883ee3ae+9-9

core: use LockedInc32() instead of InterlockedIncrement()

Impact

Le comportement ne change pas ; le code utilise uniformément le wrapper atomique du framework sur Delphi et FPC.

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

23 Faible Les tests concurrents de queue adoptent le nouveau pool de tâches test.core.threads remplace les classes thread dédiées push/wait par des descendants TSynThreadTask exécutés par une instance TSynThreadTasks, en gardant la couverture finalize, reset et multi-waiter. Tests test.core.threads c18eb6c5+340-333

test: rewrite TSynQueue using TSynThreadTasks

Impact

Le comportement applicatif ne change pas. La suite exerce le nouveau modèle ownership du task pool tout en validant la concurrence TSynQueue.

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

24 Faible La couverture de queue rejoint l’unité de tests thread Les tests complets TSynQueue de valeurs, persistence et workers passent de test.core.base à test.core.threads, près des primitives de concurrence. Tests test.core.base+2 d73f877c+200-233

test: moved TSynQueue tests to test.core.threads.pas

Impact

Le comportement applicatif ne change pas ; l’organisation des tests correspond maintenant à l’implémentation.

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

25 Faible Les chemins futex de queue gagnent des tests wake et shutdown concurrents test.core.threads ajoute producers différés, huit consommateurs WaitPop, distribution WakeOne, comportement WakeAll de WaitPopFinalize et rejet après finalization. Tests test.core.threads db598d3b+257-4

test: completed TSynQueue coverage

Impact

Aucun changement applicatif. Le comportement futex Windows et Linux est désormais exercé avec de vrais waiters concurrents.

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

26 Faible Le reset de queue reçoit une couverture multi-waiter répétée test.core.threads ajoute des cycles finalize/reset avec huit waiting threads, vérifie wake-one après reset et confirme qu’un second cycle laisse la queue opérationnelle. Tests test.core.threads 3e909874+121-40

test: enhanced TSynQueue coverage

Impact

Le comportement applicatif ne change pas. Le contrat WaitPopReset est exercé avec des sleepers concurrents et non seulement séquentiels.

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

27 Faible Les tests rapportent les exceptions inattendues avec détails structurés Les tests ZIP, réseau et ORM remplacent Check(false, E.Message) par TSynTestCase.FailedRaised. Le fixture ZIP data-descriptor utilise maintenant un buffer temporaire fixe. Tests mormot.core.test+4 fc0d9757+80-75

test: some cleanup especially after #630

Impact

Le comportement applicatif ne change pas. Les échecs gardent la classe d’exception et ses champs structurés pour faciliter le diagnostic.

Arnaud Bouchez · 13:06 UTC · PR #630 · voir le commit sur GitHub →

28 Faible Les tests crypto sélectionnent l’accélération via des helpers publics TTestCoreCrypto remplace les hypothèses AVX de compilation par HasKeccakAvx2 et HasAesGcmAvx, étend les cas AES-GCM falsifiés et vérifie le plaintext non authentifié. Tests test.core.crypt f9ad68c8+43-25

test: refined TTestCoreCrypto content

Impact

Le comportement applicatif ne change pas. Les tests exercent seulement l’accélération supportée par hardware, OS et DisabledAsm.

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

29 Faible Les tests AES-GCM rejettent ciphertext, tags et données associées altérés _AES_GCM chiffre et vérifie les longueurs 1 à 64 en modes scalar et AVX disponible, puis modifie séparément ciphertext, tag et AAD et exige l’échec de chaque vérification. Tests test.core.crypt 5f464423+24-1

test: cover forged AES-GCM ciphertext, tag and AAD in _AES_GCM

Impact

Le comportement applicatif ne change pas. La régression couvre directement le bypass d’authentification corrigé juste avant.

je · 11:40 UTC · voir le commit sur GitHub →

30 Faible Les règles de lock et ownership Tunnel sont documentées près du code mormot.net.tunnel documente les règles de concurrence : state locks courts, aucun appel externe sous lock, workers gérés par l’owner et shutdown en deux phases. TTunnelLocalThread.Abort tolère aussi self=nil. Documentation mormot.net.tunnel 2ad1823e+27-2

net: add some comments about Tunnel internal algorithms & patterns

Impact

Les commentaires ne changent pas le comportement applicatif. Le guard nil rend le shutdown interne défensif.

Arnaud Bouchez · 16:40 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