C6029
Aviso C6029: estouro de buffer possível na chamada para <function>: uso de valor não-verificado
Este aviso indica que uma função que recebe um buffer e um tamanho está sendo passada um tamanho não-verificado.Os dados lidos de uma fonte externa não foram verificados para ver se são menores que o tamanho do buffer.Um invasor pode especificar intencionalmente um valor muito maior do que o esperado para o tamanho, o que resultará em um estouro de buffer.
Em geral, sempre que você lê dados de uma fonte externa não confiável, não deixe de verificar sua validade.Geralmente é apropriado verificar o tamanho para certificar-se que está no intervalo esperado.
Exemplo
O seguinte código gera este aviso chamando a função anotada ReadFile duas vezes.Após a primeira chamada, a propriedade do atributo Post marca o segundo parâmetro não confiável.Portanto, passar um valor não confiável na segunda chamada para ReadFile gera esse aviso conforme mostrado no código o seguir:
#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;
}
Para corrigir este aviso, verifique o tamanho do buffer conforme mostrado no código o seguir:
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;
}