﻿# V642\. Function result is saved inside the 'byte' type variable\. Significant bits may be lost\. This may break the program's logic\.

Анализатор обнаружил потенциальную ошибку, связанную c сохранением результата работы функции в переменную, которая занимает всего 8 или 16 бит\. Для некоторых функций, которые возвращают статус типа 'int', это может быть недопустимо\. Могут быть потеряны значащие биты\.

Рассмотрим пример некорректного кода:

```cpp
char c = memcmp(buf1, buf2, n);
if (c != 0)
{
  ...
}
```

Функция 'memcmp' возвращает следующие значения типа 'int':

* < 0 \- buf1 less than buf2;
* 0 \- buf1 identical to buf2;
* \> 0 \- buf1 greater than buf2;

Обратите внимание\. "Больше 0", означает любые числа, а вовсе не 1\. Этими числами могут быть: 2, 3, 100, 256, 1024, 5555, и так далее\. Это значит, что этот результат нельзя поместить в переменную типа 'char'\. Могут быть отброшены значащие биты, что приведет к нарушению логики выполнения программы\.

Опасность такого рода ошибок заключается в том, что возвращаемое значение может зависеть от архитектуры и реализации конкретной функции на данной архитектуре\. Например, программа будет корректно работать в 32\-битном варианте и некорректно в 64\-битном\.

Корректный вариант кода:

```cpp
int c = memcmp(buf1, buf2, n);
if (c != 0)
{
  ...
}
```



Возможно, кому\-то данная опасность покажется надуманной\. Однако такая ошибка послужила причиной серьезной уязвимости в MySQL/MariaDB до версий 5\.1\.61, 5\.2\.11, 5\.3\.5, 5\.5\.22\. Суть в том, что при подключении пользователя MySQL /MariaDB вычисляется токен \(SHA от пароля и хэша\), который сравнивается с ожидаемым значением функцией 'memcmp'\. На некоторых платформах возвращаемое значение может выпадать из диапазона \[\-128\.\.127\]\. В итоге, в 1 случае из 256 процедура сравнения хэша с ожидаемым значением всегда возвращает значение 'true', независимо от хэша\. В результате, простая команда на bash даёт злоумышленнику рутовый доступ к уязвимому серверу MySQL, даже если он не знает пароль\. Причиной этому стал такой код в файле 'sql/password\.c':

```cpp
typedef char my_bool;
...
my_bool check(...) {
  return memcmp(...);
}
```