C6029
advertencia C6029: Posible saturación de búfer en la llamada a <función>: uso del valor sin comprobar
Esta advertencia indica que a una función que toma un búfer y un tamaño se le está pasando un tamaño que no se ha comprobado.Los datos se leyeron de algún origen externo y no se ha comprobado si son menores que el tamaño del búfer.Un atacante podría especificar intencionadamente un valor para el tamaño mucho más grande de lo esperado, lo que conducirá a una saturación del búfer.
Generalmente, cada vez que se lean datos de un origen externo que no sea de confianza, asegúrese de comprobar su validez.Habitualmente, conviene comprobar el tamaño para asegurarse de que está comprendido en el intervalo esperado.
Ejemplo
El código siguiente genera esta advertencia llamando dos veces a la función ReadFile anotada.Después de la primera llamada, la propiedad del atributo Post marca el segundo valor del parámetro que no sea de confianza.Por consiguiente, al pasar un valor que no es de confianza en la segunda llamada a ReadFile, se genera esta advertencia como se muestra en el código siguiente:
#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 corregir esta advertencia, compruebe el tamaño de búfer como se muestra en el siguiente código:
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;
}