Compartir a través de


CComVariant::ReadFromStream() devuelve un error (Acceso denegado) para la secuencia > de 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 secuencias de tamaño > 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

si el tamaño de la secuencia supera el límite máximo, debería generar 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;
}

Resolución

Si tiene un caso válido en el que transmite datos en modo de Batch Stirred Tank Reactor (BSTR) que es mayor que el tamaño predefinido, puede cambiarlo. Sin embargo, si usa algún código que no sea de confianza, esta solución alternativa no debe emplearse.

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

Información adicional

Estamos leyendo desde un flujo, y el flujo puede ser de origen no confiable. El valor máximo está ahí para detectar cualquier problema con las secuencias que se han manipulado para intentar que el código asigne una gran cantidad de memoria, causando ataques de denegación de servicio (DOS).