Jeu sécurité

Le bug du mois de février

Proposé par Eric Mittelette

  wchar _t buf[16];
  int ret;
  ret = MultiByteToWideChar(CP_ACP, 0, p, -1, buf, sizeof(buf));
  printf("%d\n", ret);


La bonne réponse

La bonne réponse est :
On a oublié que la taille de buf est en UNICODE on doit indiquer la taille en nombre de caractères UNICODE ie diviser sizeof(buf) par la taille d’un élément, le premier par exemple.

Dans ce code on divise la taille du buffer par la taille du premier élément, afin de ne pas ouvrir la porte à un potentiel buffer overrun car la taille des caractères est ici en UNICODE. C’est un bug assez courant dès lors que l’on localise du code.
Dans la documentation ce paramètre est commenté ainsi :
« Specifies the size, in wide characters » il faut donc compter le nombre de caractères « wide » et non pas le nombre d’octets !


Et le code corrigé

Proposé par Eric Mittelette

  wchar_t buf[16];
  int ret;
  ret = MultiByteToWideChar(CP_ACP, 0, p, -1,buf, sizeof(buf)/sizeof(buf[0]));
  printf("%d\n", ret);

Pour aller plus loin

Article en anglais : MultiByte to WideChar 

Regardez les webcasts des Rencontres Sécurité pour les développeurs, et notamment le webcast concernant les problèmes liés à la localisation

Le centre de conseils sur la sécurité pour les développeurs

Writing Secure Code, l’ouvrage de référence  

Le règlement | Comment jouer ? | Liste des gagnants


**
**
**
**
**
**