Bonjour à tous,
J'ai récupéré le code d'une fonction extraite du code du logiciel libre xrdp et je tente désormais de corriger la faille de sécurité qui y est présente.
Voici le code de la fonction :
Le code suivant suffit à provoquer une "Erreur de segmentation" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 int add_char_at(char* text, char ch, int index) { int len; int i; len = g_strlen(text); if (index >= len || index < 0) { text[len] = ch; text[len + 1] = 0; return 0; } for (i = len - 1; i >= index; i--) { text[i + 1] = text[i]; } text[i + 1] = ch; text[len + 1] = 0; return 0; }
Selon moi le problème se situe au niveau de la taille véritable de la chaîne text. Cette taille devrait être comparée à la taille récupérée par strlen afin de savoir si la chaîne est pleine. Auquel cas, si on décale les caractères ou qu'on ajoute un caractère en fin de chaîne, alors il y a un débordement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int main() { char text[3]; strcpy(text, "ac"); add_char_at(text, 'f', 1); return 0; }
Il me semble qu'il n'est pas possible de récupéré la taille réelle de la chaîne étant donné qu'il s'agit d'un char * récupéré en paramètre.
Selon moi, la seule solution serait de modifier le code en profondeur afin d'ajouter comme nouveau paramètre la taille réelle de ce fameu char *.
Avez vous d'autres suggestions ou des critiques à faire vis à vis de mon explication ?
Bonne journée![]()
Partager