Agir maintenantpeut affecter un système en production
Les clients HTTP et WebSockets se stabilisent après une large optimisation ECC
Cette édition corrige plusieurs lacunes du cycle de vie des WebSockets HTTP.sys et le traitement des en-têtes de réponse pour WinINet, WinHTTP, le client HTTP de Delphi et libcurl. Le même lot réécrit de nombreux chemins arithmétiques ECC P-256 pour ARM, i386 et x86-64, tout en rétablissant la compilation avec Delphi 7/2007 et Delphi POSIX. Les utilisateurs Kerberos POSIX doivent aussi prendre en compte deux changements de signature publics liés aux keytabs.
En bref
- Utilisez le build 2.4.17531 : il contient la série complète des en-têtes des clients HTTP et tous les correctifs de compatibilité.
- Les builds 2.4.17513 à 2.4.17515 contiennent un token fixme isolé dans mormot.core.base et ne doivent pas être utilisés.
- TServerSspiKeyTab.PrepareKeyTab renvoie désormais boolean et ServerForceKeytab accepte RawUtf8 au lieu de TFileName.
- Le nettoyage, les callbacks idle, le suivi des ping et les échecs d'envoi des WebSockets HTTP.sys ont été revus sur sept commits.
Conseil de mise à jour
Passez directement au build 2.4.17531 plutôt qu'à une révision intermédiaire. Recompilez les appels à TServerSspiKeyTab.PrepareKeyTab et ServerForceKeytab, puis retestez l'arrêt des WebSockets HTTP.sys, les envois rejetés, les callbacks idle, les redirections libcurl et les en-têtes des clients Windows. N'utilisez pas les builds 2.4.17513-2.4.17515 : mormot.core.base contient un token fixme invalide.
30 sur 30 entrées · 33 commits upstream
1
Élevée
La gestion keytab POSIX devient verrouillée, UTF-8 et porteuse de résultat
TServerSspiKeyTab protège nom de fichier et séquence avec fSafe, convertit TFileName en UTF-8 avant GSSAPI et conserve le keytab actif si le remplacement est invalide. PrepareKeyTab devient une fonction boolean et ServerForceKeytab prend RawUtf8.
Ruptures
mormot.lib.gssapi
4059a7dd+53-38
lib: several TServerSspiKeyTab fixes
Impact
Les appels directs doivent être recompilés pour les deux changements de signature. Les noms Delphi POSIX arrivent à GSSAPI en UTF-8 et les lecteurs concurrents ne voient plus un nom keytab non protégé.
Migration nécessaire
Recherchez PrepareKeyTab et utilisez ou ignorez explicitement son résultat boolean ; passez des valeurs RawUtf8 UTF-8 aux appels directs de ServerForceKeytab. Utilisez le build 2.4.17505 ou ultérieur.
API publique
TServerSspiKeyTab.PrepareKeyTabsignature-changed — La procedure devient function PrepareKeyTab: boolean.ServerForceKeytabsignature-changed — Le paramètre passe de TFileName à RawUtf8 encodé en UTF-8.
Unités
2
Élevée
Le nettoyage d'alignement rend brièvement mormot.core.base non compilable
Plusieurs records de taille naturelle perdent packed pour améliorer l'alignement ARM, dont THash128Rec, THash256Rec, THash512Rec, TDebugSymbol et TDebugBlock. Le même diff insère accidentellement un token fixme isolé avant InterlockedIncrement.
Ruptures
mormot.core.base+3
b66d0984+13-13
core: don't use "packed record" unless really needed
Impact
Les builds 2.4.17513 à 2.4.17515 ne peuvent pas compiler mormot.core.base car fixme est du Pascal invalide. Après correction, les accès ARM peuvent être plus rapides ; les consommateurs de layout brut doivent être reconstruits ensemble.
Mise à jour recommandée
Ne vous arrêtez pas aux builds 2.4.17513-2.4.17515 ; utilisez le build 2.4.17516 ou ultérieur et reconstruisez toutes les unités ensemble.
API publique
THash128Rec, THash256Rec, THash512Rec, TDebugSymbol, TDebugBlock and related recordsbehaviour-changed — Le modificateur packed est retiré lorsque l'alignement naturel suffit ; reconstruisez les consommateurs de layout binaire.
3
Élevée
Les échecs HTTP.sys et le teardown WebSocket deviennent visibles et bornés
HttpSendResponse et SendResponse renvoient le succès réel, les chemins fichier statique et Range invalide sortent immédiatement, les handshakes WebSocket échoués libèrent les handles, OnDisconnect ne suit qu'une connexion établie et le teardown attend au plus cinq secondes.
Correctifs
mormot.net.server
cc55fa88+58-40
net: several THttpApiServer/THttpApiWebSocketServer fixes
Impact
Les appels HTTP.sys ne prennent plus un envoi échoué pour un succès, les fichiers/ranges invalides cessent le traitement, les upgrades partielles ne fuient plus de handles et l'arrêt n'attend plus indéfiniment.
Mise à jour recommandée
Mettez à niveau les serveurs HTTP.sys et retestez fichiers statiques, Range invalides, upgrades WebSocket échouées et arrêt avec pairs actifs.
Unités
4
Élevée
Les envois WebSocket HTTP.sys échouent proprement et les files se vident
Broadcast intercepte les exceptions d'envoi par connexion et lance la fermeture, les ensembles d'états actifs/fermés sont centralisés, l'arrêt ignore les connexions déjà closes et ProcessActions continue sans double complétion.
Correctifs
mormot.net.server
6e02ccef+37-25
net: some http.sys WebSockets fixes
Impact
Un WebSocket défaillant n'interrompt plus un broadcast, les échecs sont signalés par le résultat boolean et les actions receive/close risquent moins de bloquer ou se terminer deux fois.
Mise à jour recommandée
Retestez les broadcasts avec un pair déconnecté ainsi que close/shutdown sous I/O concurrentes.
Unités
5
Élevée
L'enregistrement keytab est retenté après un échec GSSAPI par thread
PrepareKeyTab copie la séquence principale sous verrou mais ne met à jour la threadvar qu'après succès de ServerForceKeytab. SetKeyTab vérifie les changements et FileIsKeyTab sous fSafe.
Correctifs
mormot.lib.gssapi
0a647b66+29-21
lib: minor TServerSspiKeyTab fixes
Impact
Les échecs Heimdal ou transitoires sont retentés sur le même thread au lieu d'être considérés comme préparés, et le refresh concurrent ne concurrence plus les métadonnées mises en cache.
Mise à jour recommandée
Utilisez le build 2.4.17505 ou ultérieur pour le hot reload keytab POSIX ; ne vous arrêtez pas au premier commit de changement de signature.
Unités
6
Élevée
De nouveaux sélecteurs assembleur ARM réparent aussi la déclaration core cassée
mormot.defines.inc introduit ASMARM64 et ASMINTELARM et les annule sous NOASMBLOCK. mormot.core.base adopte ASMINTELARM pour les déclarations atomiques et retire le token fixme isolé ajouté au build 17513.
Correctifs
mormot.core.base+1
6f93fc70+24-16
core: new ASMINTELARM/ASMARM64 conditionals
Impact
Les builds 2.4.17513 à 2.4.17515 contiennent du Pascal invalide dans mormot.core.base ; le build 2.4.17516 rétablit la compilation et fournit des sélecteurs stables pour l'assembleur ECC suivant.
Mise à jour recommandée
Évitez les builds 2.4.17513-2.4.17515 et utilisez le build 2.4.17516 ou ultérieur.
7
Élevée
Les serveurs HTTP.sys retrouvent logging, télémétrie et OnIdle périodiques
THttpApiServer crée un TSynBackgroundThreadProcess nommé HttpApiIdle, appelle la méthode virtuelle DoIdle chaque seconde avec les temps monotones et libère le worker avant le teardown principal.
Correctifs
mormot.net.server
df25cd22+25-6
net: fixed logger + telemetry + OnIdle() support in THttpApiServer
Impact
Les backends HTTP.sys Windows vident de nouveau les logs, consolident la télémétrie, appellent OnIdle et entretiennent blacklist/keytab même sans trafic.
Mise à jour recommandée
Mettez à niveau les services HTTP.sys dépendant de OnIdle, du flush des logs, de la télémétrie ou du refresh keytab, puis observez le worker idle à l'arrêt.
Unités
8
Élevée
libcurl n'expose plus que les en-têtes de la réponse finale
TCurlHttp installe CurlWriteLastResponseHeader comme callback d'en-têtes. Le callback efface le bloc accumulé à chaque nouvelle ligne de statut HTTP, puis ajoute les en-têtes de la réponse courante.
Correctifs
mormot.net.client
b9bdb628+16-3
net: fix TCurlHttp intermediate response headers
Impact
Les redirections et autres échanges multi-réponses ne mélangent plus les en-têtes intermédiaires dans TCurlHttp.Header ; les appels lisent ceux du statut final.
Mise à jour recommandée
Mettez à niveau si TCurlHttp suit des redirections ou reçoit 100 Continue, puis retestez le code lisant les en-têtes.
Unités
9
Élevée
Les en-têtes Windows conservent un stockage Unicode valide et des noms propres
TWinHttp.InternalAddHeader conserve le résultat Utf8ToSynUnicode dans une variable SynUnicode locale et transmet sa longueur réelle en caractères larges. TDelphiNetHttp.InternalAddHeader découpe séparément noms et valeurs.
Correctifs
mormot.net.client
59a88c92+11-7
net: TWinHttp and TDelphiNetHttp client fixes
Impact
TWinHttp évite un pointeur vers une chaîne temporaire et une confusion de longueur UTF-8/Unicode ; le client Delphi ne transmet plus les espaces entourant les en-têtes personnalisés.
Mise à jour recommandée
Retestez les en-têtes personnalisés non ASCII ou entourés d'espaces avec TWinHttp et TDelphiNetHttp.
Unités
10
Élevée
Delphi 7 et 2007 conservent un fallback de réduction P-256 compatible
_modMultN est séparé par HASQWORD. Les compilateurs modernes utilisent la réduction de Barrett ; Delphi 7/2007 gardent l'algorithme précédent par décalage et soustraction sans sémantique UInt64 non signée.
Compilateur & plateforme
mormot.crypt.ecc256r1
597b691f+61-7
crypt: circumvent Delphi 7/2007 compiler restriction
Impact
Les anciens Delphi compilent et continuent de produire les résultats P-256 via le chemin éprouvé plus lent. Les backends récents gardent le réducteur optimisé.
Mise à jour recommandée
Utilisez le build 2.4.17522 ou ultérieur pour compiler mormot.crypt.ecc256r1 avec Delphi 7 ou 2007.
Unités
11
Élevée
Les builds Delphi POSIX retrouvent l'aide de multiplication large
mormot.core.base ajoute une implémentation Delphi de mul64x64 hors de la branche FPC. Les expressions de carry ECC reçoivent aussi des conversions ordinal et PtrUInt/QWord acceptées par Delphi POSIX.
Compilateur & plateforme
mormot.core.base+2
c763b013+23-9
crypt: fixed Delphi POSIX compilation
Impact
Les cibles Delphi POSIX compilent de nouveau la nouvelle arithmétique ECC. Le changement concerne uniquement la compatibilité du compilateur et ne modifie pas les API applicatives.
Mise à jour recommandée
Utilisez le build 2.4.17523 ou ultérieur pour Delphi POSIX et reconstruisez les applications dépendant d'ECC.
12
Élevée
Le découpage des en-têtes HTTP compile avec les Delphi pris en charge
TDelphiNetHttp.InternalAddHeader stocke les résultats de TrimCopy dans des variables RawUtf8 explicites avant leur conversion en string pour THTTPClient.AddHeader.
Compilateur & plateforme
mormot.net.client
0a8341fb+8-5
net: fixed TDelphiNetHttp header trimming compilation
Impact
L'appel en ligne de la surcharge procedure de TrimCopy ne compilait pas ; les backends Delphi utilisant TDelphiNetHttp compilent de nouveau sans changer le code applicatif.
Mise à jour recommandée
Utilisez le build 2.4.17529 ou ultérieur si TDelphiNetHttp est activé.
Unités
13
Moyenne
La fermeture et le suivi des ping WebSocket HTTP.sys partagent un chemin
THttpApiWebSocketConnection.DoClose centralise le statut, le contexte et BeginClose. Le timestamp ping est fixé avant l'envoi, les ping/pong ne renouvellent plus l'activité normale et les fermetures passent par DoClose.
Correctifs
mormot.net.server
303139a2+23-29
net: new THttpApiWebSocketConnection.DoClose internal method
Impact
Les connexions WebSocket idle ne restent pas vivantes uniquement grâce aux ping serveur et les échecs produisent un état de fermeture cohérent. Pas de changement d'API applicative.
À regarder
Unités
14
Moyenne
WinINet et WinHTTP ne renvoient plus la ligne de statut comme en-tête
RemoveHeadInHeaders supprime les espaces puis une éventuelle ligne de statut HTTP initiale. TWinHttpApi.InternalRetrieveAnswer et TCurlHttp l'appliquent avant d'exposer ou d'analyser les en-têtes.
Correctifs
mormot.net.client
e46374f3+21-12
net: fixed WinINet/WinHttp retrieved headers
Impact
Les appels reçoivent un bloc normalisé au lieu d'un pseudo-en-tête contenant le statut HTTP/1.x. Les recherches deviennent cohérentes entre clients Windows et curl.
Mise à jour recommandée
Retestez le code qui analyse la première ligne des en-têtes ; elle commence désormais par un véritable champ.
Unités
15
Moyenne
Les buffers et files d'actions WebSocket résistent aux échecs de callback
DoOnMessage efface fBuffer dans finally, ProcessActions continue après une action d'envoi complète au lieu de tomber dans la suite, et UpgradeToWebSocket découpe chaque nom de sous-protocole demandé.
Correctifs
mormot.net.server
a2fab1d6+8-9
net: minor THttpApiWebSocketServer tweaks
Impact
Une exception OnMessage ne laisse plus de payload périmé pour le message suivant, les fins d'envoi ne corrompent plus le traitement et les listes de protocoles espacées négocient correctement.
Mise à jour recommandée
Retestez les messages fragmentés, les exceptions OnMessage et la négociation des sous-protocoles sur HTTP.sys WebSockets.
Unités
16
Moyenne
Les serveurs HTTP exposent un hook virtuel unique de maintenance idle
THttpServerGeneric ajoute la méthode protégée virtuelle DoIdle(tix64, sec32). Les serveurs socket y déplacent logger, analyzer, OnIdle, blacklist et maintenance keytab POSIX ; le serveur async réutilise ce chemin.
Nouveautés
mormot.defines+2
ddb42855+37-42
net: new THttpServerGeneric.DoIdle virtual method
Impact
Les sous-classes peuvent étendre la maintenance périodique de façon cohérente, tandis que les backends socket et async conservent leurs callbacks via l'implémentation partagée.
À regarder
API publique
THttpServerGeneric.DoIdleadded — La procedure protégée virtuelle DoIdle(tix64: Int64; sec32: cardinal) centralise le travail périodique du serveur.
17
Moyenne
i386 reçoit les multiplications 128 et 256 bits natives
mormot.crypt.core.asmx86 ajoute _mult128 et _mult256. L'unité Pascal dirige toutes les cibles ASMINTEL, dont i386, vers les routines natives de multiplication et carré.
Performance
mormot.crypt.core+1
afce8c72+602-98
crypt: new i386 asm for _mult256() and _mult128()
Impact
Les opérations ECC Intel/AMD 32 bits évitent le chemin Pascal générique. Le source applicatif et les formats cryptographiques restent inchangés.
18
Moyenne
La réduction du nombre premier P-256 passe en assembleur Intel
_mmodP est déclaré dans mormot.crypt.core pour ASMINTEL et implémenté dans les includes i386 et x86-64. mormot.crypt.ecc256r1 garde son réducteur Pascal uniquement hors Intel.
Performance
mormot.crypt.core+3
15884e94+497-4
crypt: x86_64/i386 asm specific mormot.crypt.ecc256r1 computation of _mmodP
Impact
La multiplication P-256 sur i386 et x86-64 utilise une réduction modulaire spécifique à l'architecture. Clés, signatures et API publiques ne changent pas.
19
Moyenne
Les atomiques ARMv7 reçoivent des implémentations natives avec barrières
L'include AArch64 devient mormot.core.base.asmarm.inc et reçoit des boucles ARMv7 LDREX/STREX entourées de DMB ISH. ASMARM les sélectionne sur AArch64 et ARMv7+ avec CPUARM_HAS_DMB.
Performance
mormot.core.base+2
a1079132+320-164
core: ARMv7 asm for Locked*() - in a single mormot.core.base.asmarm.inc
Impact
Les verrous et compteurs FPC ARMv7 gardent une barrière mémoire complète avec moins d'appels RTL. Les anciens ARM restent sur le fallback RTL protégé.
20
Moyenne
ARMv8 reçoit une arithmétique large déroulée pour ECC
mormot.core.base.asmarm.inc ajoute des routines AArch64 d'addition, soustraction, décalage et multiplication 128/256 bits. mormot.crypt.core les sélectionne via ASMARM64 plutôt que les équivalents Pascal plus lents.
Performance
mormot.core.base+2
284915df+357-44
crypt: new unrolled ARMv8 64-bit asm for 128-bit and 256-bit computation
Impact
Les charges cryptographiques Delphi/FPC AArch64 utilisent l'arithmétique large native, accélérant surtout les internes ECC sans changer le code applicatif.
21
Moyenne
AArch64 reçoit une réduction dédiée pour le nombre premier P-256
ASMARM64 publie maintenant une implémentation AArch64 de _mmodP depuis mormot.core.base.asmarm.inc, et mormot.crypt.ecc256r1 exclut l'implémentation Pascal sur cette cible.
Performance
mormot.core.base+2
1dec0f83+153-2
crypt: specific mormot.crypt.ecc256r1 computation in pure aarch64 asm
Impact
Les calculs internes de multiplication et signature ECC P-256 utilisent la réduction AArch64 native. Les formats et appels publics restent inchangés.
22
Moyenne
La réduction des scalaires P-256 passe à l'arithmétique de Barrett
mormot.crypt.ecc256r1 ajoute BARRETT_N_MU_LOW et remplace la réduction bit à bit de Curve_N_32 dans _modMultN par une réduction de Barrett à largeur fixe puis au plus deux soustractions masquées.
Performance
mormot.crypt.ecc256r1
49108d2f+81-51
crypt: use Curve_N_32 Barret Reduction algorithm for ecc256r1
Impact
La multiplication scalaire ECDSA et la signature effectuent moins d'étapes de réduction dépendantes des données sur les compilateurs modernes. Les sorties cryptographiques doivent rester identiques.
À regarder
Unités
23
Moyenne
Les ping WebSocket HTTP.sys passent dans le cycle idle du serveur
THttpApiWebSocketServer supprime TSynWebSocketGuard et surcharge DoIdle pour parcourir les connexions. Il sépare dernière activité et dernier ping, renouvelle l'activité après réception ou envoi non ping et rend PingTimeout modifiable.
Sous le capot
mormot.net.server
39a07c59+62-88
net: refactored http.sys WebSockets PING process
Impact
Le timeout ping partage désormais le thread idle d'une seconde et considère les envois applicatifs réussis comme activité. Le code existant peut aussi modifier PingTimeout après construction.
À regarder
API publique
THttpApiWebSocketServer.PingTimeoutbehaviour-changed — La propriété devient modifiable et les timeouts passent par DoIdle au lieu de TSynWebSocketGuard.
Unités
24
Faible
La mise au carré P-256 utilise un assembleur Intel et AMD dédié
Des implémentations natives de _square256 sont ajoutées aux includes i386 et x86-64 ; mormot.crypt.core n'implémente plus le carré Intel via _mult256.
Performance
mormot.crypt.core+2
f6c7eed7+506-13
crypt: native i386/x64 asm version of _square256()
Impact
L'arithmétique ECC sur cibles Intel/AMD 32 et 64 bits utilise un chemin spécialisé. Aucun changement de source applicative ni de données sérialisées.
25
Faible
La comparaison d'entiers larges est spécialisée pour x86-64 et AArch64
_cmp256 passe à des implémentations natives pour ASMX64 et ASMARM64, tandis que la comparaison Pascal reste pour les autres cibles CPU64. Un commentaire précise aussi pourquoi TSynAngelizeState reste packed.
Performance
mormot.app.agl+4
7023137e+70-25
crypt: x64 and aarch64 asm for _cmp256() function
Impact
Les comparaisons ECC coûtent moins sur x86-64 et AArch64. Le layout binaire de TSynAngelizeState et le comportement public restent inchangés.
26
Faible
L'inversion modulaire P-256 effectue moins de comparaisons larges
_modInv retarde _cmp256 jusqu'à ce que les deux opérandes soient impairs, remplace les couples comparaison/soustraction par le borrow de _sub256 et utilise _inc256 en place.
Performance
mormot.crypt.ecc256r1
a83aa6a6+38-33
crypt: slightly optimized _modInv() for ecc256r1
Impact
Les backends ECC Pascal et non spécialisés réduisent le travail interne d'inversion ; signatures, clés et comportement public restent identiques.
Unités
27
Faible
Le multiplicateur 256 bits en Pascal réduit le coût de boucle
_mult256 sélectionne chaque diagonale par pointeurs de départ et nombre d'itérations explicite, combine directement les carries et écrit via PQWordArray au lieu de retester les indices.
Performance
mormot.crypt.core
e657f90d+21-25
crypt: faster pure pascal _mult256() algorithm
Impact
Les cibles sans assembleur spécialisé, surtout ARM à ce stade de la série, effectuent la multiplication ECC interne avec moins de coût de boucle Pascal. Les API ne changent pas.
Unités
28
Faible
DoubleToAscii utilise la multiplication large native sur ARM
Le chemin Grisu d2a_diy_fp_multiply utilise désormais ASMINTELARM et mul64x64 sur ARMv7 et AArch64, avec un accès au mot de normalisation via PQWordArray.
Performance
mormot.core.text
0fe4797b+6-6
core: slightly faster DoubleToAscii() on arm32/aarch64
Impact
Les backends Delphi et FPC ARM formatent les Double par un chemin de multiplication interne plus rapide ; le format de sortie et les API publiques ne changent pas.
Unités
29
Faible
Les wrappers atomiques FPC sont sélectionnés selon le CPU
mormot.core.base réorganise Locked et Interlocked pour FPC : Intel utilise une ReadWriteBarrier vide autour des atomiques RTL, AArch64 garde son include assembleur et les autres CPU leurs barrières explicites. Les byte swaps et helpers de refcount rejoignent la branche FPC commune.
Sous le capot
mormot.core.base
d1bb00c2+50-47
core: refactored FPC Locked*() functions
Impact
FPC Intel évite les barrières redondantes tandis que les cibles non Intel préservent l'ordre mémoire. Les signatures atomiques publiques et le code applicatif ne changent pas.
Unités
30
Faible
La conversion Decimal128 ne déclenche plus le hint FPC sur le littéral
mormot.db.nosql.bson nomme le multiplicateur 100000000000000000 comme constante QWord BIGPOW10 et transmet cette constante typée à mul64x64 dans TDecimal128.FromText.
Entretien
mormot.db.nosql.bson
42184b30+6-3
db: fixed FPC compiler hint in TDecimal128 process
Impact
Les builds FPC perdent un hint du compilateur ; le parsing Decimal128 et sa représentation binaire ne changent pas.