Miss Geekette

Une geekette, c’est comme un geek… mais au féminin


Sous ce jeu de mot complètement foireux que je dois être le seul à comprendre ce cache un début d’explication sur l’hécatombe des Zune depuis le 31 Décembre 2008. La critique est facile, on peut se moquer de Microsoft tant que l’on veut avec les bugs et autres failles de sécurités sur ces produits. Mais pour une fois qu’on à le code source provoquant le problème, profitons en pour comprendre le pourquoi du comment.

Voici la première partie de code qui va nous permettre d’expliquer le problème:

Grosso modo le hic survient lors des années bissextiles. Le programme prévoit une condition particulière pour ces années. Sauf que la condition n’est pas bonne ! Explications:

  • un test est fait pour savoir si l’année est bissextile (If(IsLeapYear(year))
  • si c’est bien le cas, un second test est effectué pour savoir si le nombre de jour est supérieur à 366 (nombre de jours dans une année bissextile)
  • si c’est le cas, on passe à l’année supérieur (tout en réinitialisant le nombre de jour de l’année)

Le problème vient en effet du test dans le cas d’une année comportant 366 jours. Il n’est pas bon car sans instruction pour gérer les autres cas (si c’est supérieur ou égale à 366 jours), le programme va boucler indéfinement. C’est ce qui c’est passé le 31. Car le test aurait du être if(days >= 366).

Mais ce morceau de code ne vaut rien sans l’intégralité de la fonction que l’on peut retrouver ici. La fonction que nous intéresse est ConvertDays() ligne 253. Elle sert à calculer le nombre de jour depuis la date ORIGINALYEAR (en informatique la première date est le 1 Janvier 1970, pour le Zune c’est différent … allez comprendre), soit depuis le 1 Janvier 1980.  Cette fonction est appelée depuis GetTime() ligne 394 (et peut être depuis d’autres fonctions …) Et cette dernière est appelée par OEMGetRealTime() ligne 426. Le commentaire de cette fonction est très explicite:

// This function is called by the kernel to retrieve the time from the real-time clock.

Autant dire que nous sommes dans les couches bas niveau du fonctionnement du Zune. L’intégralité du code représente le jeu de fonction dédiée à la gestion de l’horloge (temps réelle) interne du Zune. Cette horloge est gérée par une puce MC13783 PMIC RTC.

Voilà donc une petite explication détaillé du pourquoi du comment. Il apparait que les autres produits utilisant la même puce soit aussi affectés par ce bug comme le Toshiba Gigabeat S Series qui semble avoir été utilisé comme base pour construire le Zune.


Ecrire un commentaire