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 : 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;
}
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
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