CComVariant::ReadFromStream() devuelve un error (acceso denegado) para el flujo > 1 MB

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

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

Síntomas

Ha desarrollado una aplicación que usa para leer datos de una secuencia y devuelve un mensaje de error (acceso denegado) para el tamaño de la secuencia > CComVariant::ReadFromStream() 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 producirse un error 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 tienes un escenario válido en el que estás transmitiendo datos como Batch Despejado (BSTR) que es mayor que el tamaño predefinido, puedes cambiarlo. Sin embargo, si usa código que no es de confianza, esta solución alternativa no debe usarse.

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

Más información

Estamos leyendo desde una secuencia y la secuencia puede ser de un 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.