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

Traduções deste artigo Traduções deste artigo
ID do artigo: 303643 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Expandir tudo | Recolher tudo

Neste artigo

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;
    }
    
    // ISequentialStream
    HRESULT 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.

Propriedades

ID do artigo: 303643 - Última revisão: quarta-feira, 26 de fevereiro de 2014 - Revisão: 1.5
A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbnosurvey kbarchive kbmt kbhotfixserver kbqfe kbbug kbfix kbmdac260sp2fix KB303643 KbMtpt
Tradução automática
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

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com