commit 6df1fa60d5ea4a59b1fbfe42c3ac7f2de0c00285
parent 24fb428a7205a50411b77ba260ea26bdb3aa404c
Auteur: Loïc Daignault-Pichette <loic@asteride.xyz>
Date: Thu, 9 Apr 2026 11:04:19 -0400
Donner une zone tampon au segmenteur
Il n’est plus risqué pour l’interpréteur de ne pas vérifier si base + c dépasse
les bornes du segmenteur, puisque qu’il est maintenant garanti que, pour toute
base valide et pour tout c d’un octet, base + c tombe dans les limites du
segmenteur.
Diffstat:
1 fichier modifié, 13 insertions(+), 0 suppressions(-)
diff --git a/tfd.c b/tfd.c
@@ -10,6 +10,9 @@
#define TAMPON_LNGR_DEF 64
+/* Renvoie le maximum de deux nombres. */
+#define MAX(n1, n2) ((n1) > (n2) ? (n1) : (n2))
+
/* Écrire la valeur val dans le tampon te, en préservant le boutisme de
* l’hôte. ecrire_16() écrit deux octets et ecrire_32() en écrit 4.
* Renvoie un pointer vers l’octet suivant le dernier écrit. */
@@ -159,6 +162,7 @@ segmenteur(struct tfm *tfm)
size_t isegm; /* Indice dans le segmenteur. */
size_t ietat, ntrans, itrans;
ssize_t base;
+ size_t bmax; /* Base maximale. */
unsigned char c;
assert(tfm);
@@ -179,6 +183,9 @@ segmenteur(struct tfm *tfm)
assert(ipile == 0);
pile[ipile][0] = 0;
pile[ipile][1] = 0;
+
+ bmax = 1;
+
do {
/* Dépiler. */
ipile = tampex_dpl(pile);
@@ -209,6 +216,7 @@ segmenteur(struct tfm *tfm)
goto erreur3;
segm[base + c][0] = 1; /* Réserver la paire. */
segm[base + c][1] = (isegm << 1) | 0x00;
+ bmax = MAX(isegm, bmax);
if ((ipile = tampex_empl((void **)&pile)) < 0)
goto erreur3;
pile[ipile][0] = base + c;
@@ -223,6 +231,11 @@ segmenteur(struct tfm *tfm)
tampex_libr(finaux);
tampex_libr(pile);
+ /* Faire que les données du transducteur ne puissent interférer avec
+ * l’interprétation du segmenteur en assurant que la base la plus haute
+ * soit suivie par au moins 255 paires dans le segmenteur. */
+ tampex_minim((void **)&segm, bmax + 255);
+
/* Désactiver les paires vides. */
for (isegm = 0; tampex_dedans(segm, isegm); isegm++)
if (segm[isegm][0] == 0)