Agir maintenantpeut affecter un système en productionLe payload brut ne contient aucun marqueur superseded_by. Les deux fenêtres à éviter reposent sur des diffs consécutifs qui complètent explicitement les changements ABI Win64 et DNS TC=1 précédents. TCachedValues n’est référencé nulle part ailleurs que dans sa déclaration et son implémentation à cette révision ; le défaut de Exists ne touche donc que les nouveaux utilisateurs.
DNS retente les réponses tronquées et l’allocation Win64 respecte l’ABI
Les clients DNS retentent maintenant toute réponse UDP tronquée via TCP et rejettent plus sûrement les noms compressés malformés ; le texte des enregistrements TXT et HINFO est décodé selon son format réseau préfixé par la longueur. Les utilisateurs FPC Win64 reçoivent une réparation en deux commits qui supprime les manipulations du pointeur de pile autour des appels dans mormot.core.fpcx64mm et remplace une routine de verrouillage pouvant provoquer une faute sous l’émulation Windows ARM. Le nouveau wrapper TCachedValues n’est pas prêt à l’emploi, car les branches de comparaison de Exists sont inversées dans cette révision.
En bref
- DnsQuery retente maintenant via TCP les réponses TC=1 même si le paquet UDP ne contient aucune réponse ou porte un code d’erreur.
- DnsParseString rejette les pointeurs de compression vers l’avant, vers soi-même et réservés ; TXT et HINFO suivent désormais leur encodage RFC préfixé par la longueur.
- Sous FPC Win64, mormot.core.fpcx64mm n’utilise plus push/pop autour des appels sensibles à l’ABI ; prenez la build 2.4.16790 plutôt que de vous arrêter à 2.4.16784.
- TCachedValues devient public, mais TCachedValues.Exists échoue toujours avec le comparateur par défaut et ignore CustomCompare lorsqu’il est fourni dans cette révision.
Conseil de mise à jour
Les utilisateurs FPC Win64 de FPC_X64MM et les applications dépendant de mormot.net.dns devraient passer à la build 2.4.16790. Ne vous arrêtez pas à la build 2.4.16784, avant la conversion des derniers sites push/pop Win64, ni à la build 2.4.16786, avant que le fallback TC=1 accepte les paquets tronqués avec code d’erreur. N’adoptez pas TCachedValues.Exists avant la correction de la sélection du comparateur.
9 sur 9 entrées · 10 commits upstream
1
Élevée
L’assembleur de l’allocator Win64 confie la préservation de pile aux variables locales FPC
mormot.core.fpcx64mm réécrit les chemins MSWINDOWS de _GetMem, _ReallocMem et _AllocMem afin de sauvegarder registres non volatils et valeurs temporaires dans des variables locales déclarées plutôt qu’avec push/pop autour des appels. mormot.core.os supprime aussi l’assembleur x86-64 dédié de TRWLock.ReadOnlyLock et utilise l’implémentation Pascal LockedExc/SpinAndWait après l’observation d’un GPF sous Windows ARM PRISM.
Correctifs
mormot.core.fpcx64mm+1
3aca6e26+109-66
core: fixed fpcx64mm on Win64 ABI
Impact
Le code FPC Win64 utilisant FPC_X64MM ne modifie plus rsp autour des appels imbriqués sensibles à l’ABI dans ses principaux chemins d’allocation, ce qui réduit le risque de crash ou corruption. Les systèmes Windows ARM exécutant du x86-64 via PRISM évitent le GPF observé dans TRWLock ; les autres plateformes conservent leurs chemins.
Mise à jour recommandée
Les déploiements FPC_X64MM Win64 devraient prendre ce commit avec 4af05f7 et reconstruire depuis la build 2.4.16785 ou ultérieure, sans s’arrêter à 2.4.16784.
2
Élevée
Les derniers appels de l’allocator Win64 cessent de préserver les registres avec push et pop
mormot.core.fpcx64mm ajoute des emplacements locaux MSWINDOWS à PrefetchMediumBlock, FreeMediumBlock et _FreeMem. Les registres non volatils, la taille du bloc medium et la valeur de retour sont stockés dans le frame géré par le compilateur au lieu de modifier rsp autour des appels imbriqués ; le chemin System V conserve push/pop.
Correctifs
mormot.core.fpcx64mm
4af05f7b+48-12
core: (hopefully) one last fpcx64mm pass for Win64 ABI fixes
Impact
Cela complète la réparation ABI Win64 pour les chemins d’allocation et de libération où FPC contrôle l’alignement de pile et le shadow space. Les services utilisant FPC_X64MM sous Win64 évitent les derniers sites à risque ; l’assembleur POSIX/Linux conserve son chemin plus rapide sans frame.
Mise à jour recommandée
Utilisez la build 2.4.16785 ou ultérieure pour FPC_X64MM sous Win64 ; reconstruisez et testez intensivement allocation, réallocation et libération.
Unités
3
Élevée
Les noms DNS compressés rejettent les boucles, pointeurs vers l’avant et labels réservés
DnsParseString dans mormot.net.dns calcule séparément chaque offset de compression sur 14 bits et rejette les offsets égaux ou supérieurs à la position du pointeur ou à la limite de la réponse. Il ne mémorise que la première position de retour et rejette les formes de label réservées %01xxxxxx et %10xxxxxx avant de copier les octets.
Correctifs
mormot.net.dns
ddb63463+15-10
net: fixed DnsParseString() decoding against RFC 1035
Impact
Une réponse DNS malformée ou hostile ne peut plus maintenir le parser indéfiniment dans une chaîne de compression vers soi-même ou vers l’avant, et les pointeurs hors limites échouent avant l’accès. La compression arrière valide de RFC 1035 reste décodée.
Mise à jour recommandée
Mettez à niveau les services qui analysent des réponses provenant de résolveurs DNS externes et ajoutez des cas de pointeurs de compression malformés aux tests de protocole.
API publique
DnsParseStringbehaviour-changed — Les encodages de compression vers l’avant, vers soi-même, réservés ou hors limites retournent maintenant zéro.
Unités
4
Élevée
Une réponse UDP tronquée et vide déclenche maintenant quand même une relance DNS en TCP
DnsQuery dans mormot.net.dns accepte d’abord une réponse UDP dès que son header, sa source, son identifiant de transaction et son flag de réponse sont valides, puis inspecte Truncation avant d’exiger un corps plus long que la requête ou un AnswerCount non nul. Un header TC=1 passe donc au chemin TCP existant même sans réponse.
Correctifs
mormot.net.dns
7c79f344+12-9
net: fixed DNS responses with TC=1
Impact
Les résolveurs tels que les versions actuelles de Samba qui renvoient seulement un header tronqué via UDP ne provoquent plus un faux échec DNS. Le client suit RFC 2181 et récupère la réponse complète via TCP.
Mise à jour recommandée
Mettez à niveau les utilisateurs de mormot.net.dns touchés par des réponses manquantes de Samba ou d’autres résolveurs, et prenez la build 2.4.16790 pour inclure les contrôles TC suivants.
Unités
5
Moyenne
Les enregistrements TXT et HINFO décodent maintenant leurs champs character-string
mormot.net.dns ajoute le helper borné DnsParseCharString. DnsParseData concatène toutes les chaînes préfixées par leur longueur dans le RDATA TXT, décode exactement deux chaînes HINFO pour CPU et OS, et vide Text lorsqu’un composant dépasse la limite de l’enregistrement. Les autres unités touchées corrigent seulement l’orthographe de commentaires ou d’un message d’erreur LDAP.
Correctifs
mormot.core.text+2
55352bf1+51-7
net: properly decode TXT/HINFO DNS fields content
Impact
Les réponses TXT n’exposent plus leurs octets de longueur comme du texte et ne sont plus traitées comme un nom de domaine compressé. HINFO retourne la paire CPU et OS attendue, et les longueurs malformées échouent sans lire l’enregistrement suivant.
Mise à jour recommandée
Mettez à niveau le code qui consomme TXT ou HINFO via DnsParseData, puis vérifiez tout parser aval qui compensait auparavant le texte incorrect.
API publique
DnsParseDatabehaviour-changed — Les RDATA TXT et HINFO utilisent maintenant le décodage DNS character-string.
6
Moyenne
Les flags DNS et le fallback TCP acceptent le comportement valide des serveurs
TDnsHeader.GetZ lit maintenant Flags2, où se trouvent les bits Z. DnsQuery vérifie TC avant de rejeter un code de réponse non réussi, afin que toute réponse UDP tronquée puisse déclencher TCP, et n’exige plus RecursionAvailable dans la réponse TCP finale.
Correctifs
mormot.net.dns
f2d633a0+7-8
net: some other fixes to our DNS parser
Impact
Les serveurs DNS autoritatifs ou non récursifs peuvent répondre via TCP sans poser RA, et les paquets UDP tronqués avec code d’erreur reçoivent quand même la relance TCP obligatoire. L’inspection de Z lit maintenant le bon octet du header.
Mise à jour recommandée
Prenez au minimum la build 2.4.16787 pour le traitement de TC=1, de préférence la tête de l’édition avec les correctifs suivants du parser.
Unités
7
Moyenne
Le nouveau cache thread-safe ne retrouve pas encore correctement ses valeurs
mormot.core.unicode ajoute le record/object public TCachedValues avec protection TLightLock, un TRawUtf8DynArray trié, une remise à zéro temporelle via GetTickSec shr TixShr, et les méthodes Reset, Exists et Add. Dans Exists, la branche Assigned(CustomCompare) appelle la surcharge de comparaison par défaut, tandis que la branche nil passe nil à la surcharge de comparaison personnalisée.
Nouveautés
mormot.core.unicode
047555ca+64-2
core: new TCachedValues thread-safe wrapper
Impact
Avec CustomCompare à nil par défaut, TCachedValues.Exists appelle une surcharge qui retourne immédiatement « introuvable » faute de comparateur. Avec un comparateur personnalisé, Add trie avec celui-ci mais Exists cherche avec le comparateur sensible à la casse par défaut. Les nouveaux appelants ne peuvent donc pas se fier à Exists dans la build 2.4.16790.
À regarder
N’adoptez pas TCachedValues.Exists à cette révision ; attendez une correction ou inversez localement ses branches de comparateur et ajoutez des tests pour les comparaisons par défaut et personnalisées.
API publique
TCachedValuesadded — Cache public RawUtf8 trié et fenêtré dans le temps avec Reset, Exists et Add ; Exists est défectueux dans cette révision.
Unités
8
Faible
Les fichiers de régression réseau restent près de l’exécutable de test
TNetworkProtocols.Setup crée un répertoire temp près de l’exécutable, puis les tests OpenAPI, keytab Kerberos, bail DHCP et téléchargement HTTP l’utilisent au lieu du dossier temporaire système ou de WorkDir. Un suffixe de séquence évite aussi les collisions de noms pour les téléchargements.
Tests
73b7ed6a+57-27
tests: network protocols won't use system temp folder
Impact
Les tests évitent les permissions du dossier temporaire système et les tests en arrière-plan ne voient plus les fichiers transitoires des autres dans WorkDir. Le runtime du framework et les emplacements applicatifs ne changent pas.
9
Faible
Les tests de polices PDF acceptent les hash connus de davantage de configurations Windows
TTestUiPdf.FontEmbeddingAndHashValidation remplace deux tables de hash dépendantes de la version OS par cinq hash acceptés via IntegerScanExists. Le test utilise aussi une variable TPdfDocument explicite, affiche le nom de police avec le hash hexadécimal et conserve le second passage seulement si le remplacement ANSI_CHARSET est disponible.
Tests
5ee01b27+28-29
test: refined TTestUiPdf.FontEmbeddingAndHashValidation
Impact
Les tests de régression PDF tolèrent des différences connues d’incorporation liées aux polices installées plutôt qu’à un défaut du framework. Le code de génération PDF et la sortie applicative ne changent pas.