Agir maintenantpeut affecter un système en productionLes 30 commits non-merge ont été examinés et deux merges exclus. Le total est de 1 955 ajouts et 1 162 suppressions hors mormot.commit.inc et mormot.commit-num.inc. La source finale en 1f7febd219f9cb54175a1f87620e6862e4e670b8 a été inspectée. Aucun commit ne contient superseded_by.
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.
30 sur 30 entrées · 32 commits upstream
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à.
Mise à jour recommandée
Mettez à jour immédiatement si TAesGcmEngine peut utiliser AVX et ajoutez des tests négatifs altérant ciphertext, tag et AAD.
API publique
TAesGcmEngine.Decryptbehaviour-changed
Unités
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
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.
Mise à jour recommandée
Prenez toute la séquence Tunnel jusqu’à 0900c1f2 et testez early frames, remote close, timeout et destruction durant handshake.
API publique
TTunnelLocal.WaitForHandshakebehaviour-changedTTunnelLocal.ClosePortbehaviour-changed
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.
Unités
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.
Mise à jour recommandée
Mettez à jour si ZIP, XLSX ou ODS est chargé en mémoire et testez l’extraction de la dernière entrée.
API publique
TZipRead.Createbehaviour-changed
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.
Unités
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.
Unités
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
Unités
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.
Mise à jour recommandée
Utilisez l’implémentation WaitFor finale de 2.4.17356 et testez les attentes finies et INFINITE en concurrence.
API publique
TSynThreadPool.WaitForbehaviour-changed
Unités
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.
Mise à jour recommandée
Passez à 2.4.17356 et vérifiez que chaque THttpApiServer accepte des requêtes juste après construction.
API publique
THttpApiServer.Createbehaviour-changed
Unités
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.
Mise à jour recommandée
Mettez à jour et testez connect, enregistrement callback, disconnect et destruction TRestClientUri répétés en concurrence.
API publique
TRestClientUri.Destroybehaviour-changed
Unités
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-changedTSynQueue.WaitPeekLockedbehaviour-changed
Unités
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
TSynThreadTaskaddedTSynThreadTasksadded
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.PendingTasksaddedTSynThreadPool.TaskAllDoneadded
Unités
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
cpuAESGCMaddedHasAesGcmAvxaddedHasKeccakAvx2added
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.WaitPopResetaddedTSynQueue.Waitersadded
Unités
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
Unités
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
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.
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.
Unités
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
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.
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.
Unités
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.
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.
Unités
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.
Unités
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.
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.
Unités
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.
Unités
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.