Correction de code (sécurité)
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 :
Code:
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;
} |
Le code suivant suffit à provoquer une "Erreur de segmentation" :
Code:
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;
} |
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.
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 ;)