Bonjour à tous :)
En lisant le code de vsftpd (http://vsftpd.beasts.org/(...) ), j'ai remarqué une idée qui me semble très intéressante pour disposer de chaînes de caractères/buffers plus "pratiques" à utiliser que les habituelles structures à base de { char *buffer; size_t size; }...
En gros, on stocke la chaîne de caractère dans une map anonyme, entre deux pages protégées avec mprotect(). On en profite pour stocker la taille de la chaine dans la première page mémoire, avant verrouillage.
Je vois trois avantages extrêmement sympathiques dans cette démarche:
* la structure est compatible avec les chaînes C classiques, on utilise fourbement l'adresse de la page ou commence la chaîne et les fonctions traditionnelles n'y voient que du feu.
* si un overflow se produit, au lieu de corrompre la mémoire on terminera proprement avec un SIGSEGV dans les dents.
* on dispose de la taille tout en restant compatible: il suffit d'essayer d'enlever la protection de la page mémoire précédent l'adresse de la chaîne. Si ça marche on accède tranquillement à la taille, sinon (errno == EFAULT) on sait qu'il s'agit une chaîne ANSI.
Néanmoins, je crains que cette méthode ne soit rapidement trop gourmande en mémoire virtuelle (voire de mémoire physique ?).
Que pensez vous de cette alternative ?
Si vous connaissez d'autres techniques de ce genre, je serais ravi d'en prendre connaissance, je cherche activement à remplacer une affreuse structure string_t { uchar *data; size_t size; } qui traîne dans un de mes programmes :)
# pas tous les overflows
Posté par free2.org . Évalué à 4.
Mais si la chaine n'a pas exactement la taille d'une page, alors les petits overflows ou underflows ne seront pas détectés automatiquement.
# OpenBSD
Posté par Nicolas Bernard (site web personnel) . Évalué à 4.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.