Entrar

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.

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