Forum Programmation.c mmap() et chaînes de caractères

Posté par  .
Étiquettes : aucune
0
21
sept.
2005
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  . Évalué à 4.

    C'est en effet bien foutu.
    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  (site web personnel) . Évalué à 4.

    Je crois que c'est ce que fait de manière transparente la version courante d'OpenBSD où malloc utilise maintenant mmap pour allouer la mémoire.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.