CComVariant::ReadFromStream() devuelve un error (Acceso denegado) para la secuencia > 1 MB

Este artículo le ayuda a resolver el problema de que se produce un error (Acceso denegado) cuando la aplicación usa CComVariant::ReadFromStream() para leer datos de una secuencia.

Versión original del producto:   Visual C++
Número de KB original:   2831480

Síntomas

Ha desarrollado una aplicación que usa CComVariant::ReadFromStream() para leer datos de una secuencia y devuelve un mensaje de error (Acceso denegado) para el tamaño de la secuencia > 1 MB.

Causa

Al revisar atlcomcli.h , encontramos que el tamaño se ha establecido aquí:

#ifndef _ATL_STREAM_MAX_SIZE
#define _ATL_STREAM_MAX_SIZE0x100000
#endif

y si el tamaño de la secuencia aumenta la longitud MÁXIMA, debería producir un error de acceso denegado.

else if (cbStrLen > _ATL_STREAM_MAX_SIZE)
{
    ATLTRACE(atlTraceCOM, 0, _T('String exceeded the maximum allowed size see _ATL_STREAM_MAX_SIZE.'));
    hr = E_ACCESSDENIED;
}

Solución

Si tiene un escenario válido en el que está transmitiendo datos como Batch Stirred Tank Reactor (BSTR) que es mayor que el tamaño predefinido, puede cambiarlos. Sin embargo, si usa algún código que no sea de confianza, no se debe emplear esta solución alternativa.

Un enfoque sería invalidar CCOmVariant::ReadFromStream(). Otra manera es cambiarse _ATL_STREAM_MAX_SIZE a sí mismo.

Más información

Estamos leyendo desde una secuencia y la secuencia puede ser de origen que no es de confianza. El valor MAX está ahí para detectar cualquier problema con las secuencias que se han manipulado para probar el código para asignar un gran número de memoria que provoca ataques DOS.