Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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).