Lire en anglais

Partager via


CComVariant ::ReadFromStream() retourne une erreur (Accès refusé) pour le flux > de 1 Mo

Cet article vous aide à résoudre le problème qu’une erreur (Accès refusé) se produit lorsque votre application utilise CComVariant::ReadFromStream() pour lire des données à partir d’un flux.

Version du produit d’origine : Visual C++
Numéro de la base de connaissances d’origine : 2831480

Symptômes

Vous avez développé une application qui utilise CComVariant::ReadFromStream() pour lire des données à partir d’un flux et qu’elle retourne un message d’erreur (Accès refusé) pour la taille > de flux de 1 Mo.

Cause

En examinant atlcomcli.h , nous constatons que la taille a été définie ici :

#ifndef _ATL_STREAM_MAX_SIZE
#define _ATL_STREAM_MAX_SIZE0x100000
#endif

et si la taille du flux augmente la longueur MAXIMALE, elle doit lever une erreur d’accès refusé.

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;
}

Résolution

Si vous disposez d’un scénario valide dans lequel vous diffusez des données en tant que batch Stirred Tank Reactor (BSTR) qui est supérieur à la taille prédéfinie, vous pouvez la modifier. Toutefois, si vous utilisez un code non approuvé, cette solution de contournement ne doit pas être utilisée.

Une approche consisterait à remplacer CCOmVariant::ReadFromStream(). Une autre façon est de changer _ATL_STREAM_MAX_SIZE lui-même.

Plus d’informations

Nous lisant à partir d’un flux et le flux peut provenir d’une source non approuvée. La valeur MAX est là pour détecter les problèmes liés aux flux qui ont été manipulés pour essayer le code pour allouer un grand nombre de mémoire à l’origine d’attaques DOS.