C6029
Предупреждение C6029: возможно переполнение буфера в вызове <функция>: используется непроверенное значение.
Это предупреждение указывает, что функция принимает буфер, а переданный размер не проверяется. Считанные из внешнего источника данные не проверены и могут быть меньше размера буфера. Злоумышленник может намеренно указать размер, намного превышающий необходимый, что приведет к переполнению буфера.
Обычно при чтении данных из ненадежного внешнего источника следует проверять их допустимость. Как правило, нужно проверять размер данных, чтобы убедиться, что он соответствует допустимому диапазону.
Пример
Следующий код создает это предупреждение, дважды вызывая функцию ReadFile с аннотацией. После первого вызова свойство атрибута Post помечает второе значение параметра как ненадежное. Поэтому при передаче ненадежного значения во втором вызове функции ReadFile, как показано в следующем примере кода, возникает предупреждение:
#include "windows.h"
bool f(HANDLE hFile)
{
char buff[MAX_PATH];
DWORD cbLen;
DWORD cbRead;
// Read the number of byte to read (cbLen).
if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))
{
return false;
}
// Read the bytes
if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL)) // warning 6029
{
return false;
}
return true;
}
Чтобы исправить это предупреждение, следует проверять размер буфера, как показано в следующем примере кода:
bool f(HANDLE hFile)
{
char buff[MAX_PATH];
DWORD cbLen;
DWORD cbRead;
// Read the number of byte to read (cbLen).
if (!ReadFile (hFile, &cbLen, sizeof (cbLen), &cbRead, NULL))
{
return false;
}
// Ensure that there's enough space in the buffer to read that many bytes.
if (cbLen > sizeof(buff))
{
return false;
}
// Read the bytes
if (!ReadFile (hFile, buff, cbLen, &cbRead, NULL)) // warning 6029
{
return false;
}
return true;
}