C6029
upozornění C6029: možné přetečení vyrovnávací paměti při volání <function>: použití nekontrolované hodnoty
Toto upozornění znamená, že funkci, která přebírá vyrovnávací paměť a velikost byla předána nekontrolovaná velikost.Data o čtení nějakého externího zdroje nebyla ověřena, zda jsou menší než velikost vyrovnávací paměti.Útočník může záměrně určit hodnotu velikosti o mnoho vyšší, což může vést k přetečení vyrovnávací paměti.
Obecně při čtení dat z nedůvěryhodného externího zdroje je zapotřebí ověřit jeho platnost.Je obvykle vhodné ověřit velikost pro ujištění se, že se nachází v očekávaném rozsahu.
Příklad
Následující kód vygeneruje toto upozornění dvojitým voláním funkce s poznámkami ReadFile.Po prvním volání označí vlastnost atributu Post hodnotu druhého parametru jako nedůvěryhodnou.Proto při předávání nedůvěryhodné hodnoty v rámci druhého volání vygeneruje ReadFile toto varování, jak je tomu v následujícím kódu:
#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;
}
Chcete-li opravit toto upozornění, zkontrolujte velikost vyrovnávací paměti, jak je znázorněno v následujícím kódu:
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;
}