Você está offline; aguardando reconexão

CORRECÇÃO: Internet Explorer pára de responder ao abrir um documento XML corrompido

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 303643
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Quando você abre um documento XML com o Microsoft Internet Explorer, se o documento XML está corrompido (por exemplo, se o documento é um documento XML de UNICODE truncado), o Internet Explorer pára de responder (trava) e pode falhar.
Resolução
Para resolver esse problema, obtenha o service pack mais recente para o Microsoft Data Access Components 2.6. Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
300635INFO: Como obter o último MDAC 2.6 Service Pack
Situação
A Microsoft confirmou que este é um problema nos produtos da Microsoft listados no começo deste artigo. Esse problema foi corrigido primeiro no Microsoft Data Access Components 2.6 Service Pack 2.
Mais Informações
O código a seguir usa o analisador MSXML 3.0 para carregar um objeto que oferece suporte à interface IStream . Este objeto contém apenas os primeiros 3 bytes de um documento XML de UNICODE, para que o documento XML será truncado e dados estão corrompidos. O analisador XML não consegue detectar dados corrompidos e carrega-lo em um DOMDocument XML. O analisador também Falha ao liberar interface IStream corretamente quando ele processa o documento XML corrompido, o que eventualmente faz com que uma violação de acesso em alguns clientes, como o Internet Explorer.

Etapas para reproduzir o problema

  1. No Microsoft Visual C++, crie um novo projeto Win32 Console.
  2. Adicionar um novo arquivo C++ para o projeto e cole o código a seguir no arquivo C++:
    //Change msxml3.dll to msxml2.dll if Msxml2.dll is used.#import "msxml3.dll" #include <stdio.h>class clsIStreamOnMemory : public IStream{private:	DWORD		m_dwRef;	char *		m_pcBuffer;	unsigned	m_uBufferSize;	unsigned	m_uFilePos;public:	clsIStreamOnMemory( void * pvBuffer, unsigned uSize )	: m_dwRef(0)	, m_pcBuffer( reinterpret_cast<char *>(pvBuffer) )	, m_uBufferSize(uSize)	, m_uFilePos(0)		{}	DWORD GetRefCount() const	{ return m_dwRef; }// IUnknown            virtual HRESULT STDMETHODCALLTYPE QueryInterface(                 /* [in] */ REFIID riid,                /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);                        virtual ULONG STDMETHODCALLTYPE AddRef( void);                        virtual ULONG STDMETHODCALLTYPE Release( void);// ISequentialStream        virtual /* [local] */ HRESULT STDMETHODCALLTYPE Read(             /* [length_is][size_is][out] */ void __RPC_FAR *pv,            /* [in] */ ULONG cb,            /* [out] */ ULONG __RPC_FAR *pcbRead);                virtual /* [local] */ HRESULT STDMETHODCALLTYPE Write(             /* [size_is][in] */ const void __RPC_FAR *pv,            /* [in] */ ULONG cb,            /* [out] */ ULONG __RPC_FAR *pcbWritten)		{ 	// Not needed.			return E_NOTIMPL;		}// IStream        virtual /* [local] */ HRESULT STDMETHODCALLTYPE Seek(             /* [in] */ LARGE_INTEGER dlibMove,            /* [in] */ DWORD dwOrigin,            /* [out] */ ULARGE_INTEGER __RPC_FAR *plibNewPosition)		{ 	// Not needed.			return E_NOTIMPL;		}                virtual HRESULT STDMETHODCALLTYPE SetSize(             /* [in] */ ULARGE_INTEGER libNewSize)		{ 	// Not needed.			return E_NOTIMPL;		}                virtual /* [local] */ HRESULT STDMETHODCALLTYPE CopyTo(             /* [unique][in] */ IStream __RPC_FAR *pstm,            /* [in] */ ULARGE_INTEGER cb,            /* [out] */ ULARGE_INTEGER __RPC_FAR *pcbRead,            /* [out] */ ULARGE_INTEGER __RPC_FAR *pcbWritten)		{ 	// Not needed.			return E_NOTIMPL;		}                virtual HRESULT STDMETHODCALLTYPE Commit(             /* [in] */ DWORD grfCommitFlags)		{ 	// Not needed.			return E_NOTIMPL;		}                    virtual HRESULT STDMETHODCALLTYPE Revert( void)		{ 	// Not needed.			return E_NOTIMPL;		}                virtual HRESULT STDMETHODCALLTYPE LockRegion(             /* [in] */ ULARGE_INTEGER libOffset,            /* [in] */ ULARGE_INTEGER cb,            /* [in] */ DWORD dwLockType)		{ 	// Not needed.			return E_NOTIMPL;		}                virtual HRESULT STDMETHODCALLTYPE UnlockRegion(             /* [in] */ ULARGE_INTEGER libOffset,            /* [in] */ ULARGE_INTEGER cb,            /* [in] */ DWORD dwLockType)		{ 	// Not needed.			return E_NOTIMPL;		}        virtual HRESULT STDMETHODCALLTYPE Stat(             /* [out] */ STATSTG __RPC_FAR *pstatstg,            /* [in] */ DWORD grfStatFlag)		{ 	// Not needed.			return E_NOTIMPL;		}                virtual HRESULT STDMETHODCALLTYPE Clone(             /* [out] */ IStream __RPC_FAR *__RPC_FAR *ppstm)		{ 	// Not needed.			return E_NOTIMPL;		}};static void TestFailed();int main(int argc, char* argv[]){	CoInitialize(NULL);	TestFailed();	CoUninitialize();	return 0;}static void TestFailed(){	try	{		MSXML2::IXMLDOMDocumentPtr spDoc;				//If MSXML2.dll is used, change FreeThreadedDOMDocument30 to FreeThreadedDOMDocument26.		HRESULT hr = spDoc.CreateInstance( __uuidof(MSXML2::FreeThreadedDOMDocument30) );				if (hr != S_OK)		{			printf( "*** ERROR:failed to instantiate DOM document (hr = 0x%8.8x\n)", hr );			return;		}		/* This is the Unicode XML document that you are to load. */ 		WCHAR szDocument[] = { L"_<root></root>" };		//add the Unicode byte order mark to the beginning of the document. 		szDocument[0] = 0xFEFF;		// Create the corrupted document by truncating the document to 3 bytes. 		unsigned uBufferSize = 3;			clsIStreamOnMemory isom( szDocument, uBufferSize );		VARIANT_BOOL bLoaded = spDoc->load( &isom );		if (isom.GetRefCount() != 0)		{			printf( "*** ERROR: document is holding onto IStream when it shouldn't.\n" );		}		if (bLoaded)		{			if (uBufferSize < 4)			{				printf( "*** ERROR: Parser loaded a corrupted document.\n" );			}			else			{				printf( "Document loaded OK\n" );			}		}		else		{			printf( "Document failed to load\n" );		}	}	catch (_com_error e)	{		_bstr_t bsDesc = e.Description();	}	getchar();}HRESULT STDMETHODCALLTYPE clsIStreamOnMemory::QueryInterface(                 /* [in] */ REFIID riid,                /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject){	if (   IsEqualIID( riid, __uuidof(IUnknown))		|| IsEqualIID( riid, __uuidof(IStream))		)	{		*ppvObject = reinterpret_cast<void *>(static_cast<IStream *>(this));		AddRef();		return S_OK;	}	return E_NOINTERFACE;}            ULONG STDMETHODCALLTYPE clsIStreamOnMemory::AddRef( void){	m_dwRef ++;	return m_dwRef;}            ULONG STDMETHODCALLTYPE clsIStreamOnMemory::Release( void){	m_dwRef --;	return m_dwRef;}// ISequentialStreamHRESULT STDMETHODCALLTYPE clsIStreamOnMemory::Read(             /* [length_is][size_is][out] */ void __RPC_FAR *pv,            /* [in] */ ULONG cb,            /* [out] */ ULONG __RPC_FAR *pcbRead){	if (m_uFilePos >= m_uBufferSize)	{		// Past end of file.		if (pcbRead != NULL)		{			*pcbRead = 0;		}		return S_OK;	}	if (cb > m_uBufferSize - m_uFilePos)	{		cb = m_uBufferSize - m_uFilePos;	}	const char * pszCur = &m_pcBuffer[m_uFilePos];	memcpy( pv, &m_pcBuffer[m_uFilePos], cb );	m_uFilePos += cb;	if (pcbRead != NULL)	{		*pcbRead = cb;	}	return S_OK;}					
  3. Compilar e executar o projeto. Na janela do console, você pode ver a seguinte saída:
    *** Erro: documento está mantendo até IStream quando não deveria.
    *** Erro: O analisador carregado um documento danificado.

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 303643 - Última Revisão: 02/26/2014 18:09:53 - Revisão: 1.5

Microsoft XML Parser 2.6, Microsoft XML Parser 3.0, Microsoft XML Parser 3.0 Service Pack 1, Microsoft XML Parser 3.0 Service Pack 2, Microsoft Data Access Components 2.6, Microsoft Data Access Components 2.7

  • kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbbug kbfix kbmdac260sp2fix KB303643 KbMtpt
Comentários