FIX: Internet Explorer reageert niet meer wanneer u een beschadigd XML-Document opent

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 303643 - Bekijk de producten waarop dit artikel van toepassing is.
Dit artikel is gearchiveerd. Het wordt aangeboden in de huidige vorm en wordt niet meer bijgewerkt.
Alles uitklappen | Alles samenvouwen

Op deze pagina

Symptomen

Wanneer u een XML-document in Microsoft Internet Explorer opent als het XML-document (bijvoorbeeld als het document een afgekapte Unicode-XML-document is) is beschadigd, wordt Internet Explorer niet meer reageert (vastloopt) en kan vast lopen.

Oplossing

Ophalen van het meest recente servicepack voor Microsoft Data Access Components 2. 6 dit probleem op te lossen. Voor meer informatie klikt u op het volgende artikelnummer om het artikel in de Microsoft Knowledge Base:
300635INFO: Het verkrijgen van de meest recente MDAC 2. 6 servicepack

Status

Microsoft heeft bevestigd dat dit is een probleem in de Microsoft-producten die aan het begin van dit artikel worden vermeld.Microsoft Data Access Components 2. 6 Service Pack 2 werd voor het eerst een correctie aangebracht voor dit probleem.

Meer informatie

De volgende code wordt de MSXML 3. 0 parser voor het laden van een object dat ondersteunt deIStreaminterface. Dit object bevat alleen de eerste drie bytes van een Unicode-XML-document, zodat het XML-document wordt afgekapt en gegevens zijn beschadigd. De XML-parser niet herkent de beschadigde gegevens en laadt deze in een XML-DOM document. De parser ook niet vrij geven deIStreaminterface goed bij de verwerking van het beschadigde XML-document, waardoor uiteindelijk een toegangs fout in sommige clients, zoals Internet Explorer.

Stappen om het gedrag te reproduceren

  1. Maak een nieuw Console Win32-project in Microsoft Visual C++.
  2. Een nieuwe C++ bestand toevoegen aan het project en plak de volgende code in het bestand 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. Compileren en uitvoeren van het project. In het consolevenster ziet u de volgende uitvoer:
    *** Fout: document bezit is naar IStream wanneer dat niet moet gebeuren.
    *** Fout: Parser geladen een beschadigd document.

Eigenschappen

Artikel ID: 303643 - Laatste beoordeling: maandag 24 februari 2014 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Data Access Components 2.6
  • Microsoft Data Access Components 2.7
Trefwoorden: 
kbnosurvey kbarchive kbhotfixserver kbqfe kbbug kbfix kbmdac260sp2fix kbmt KB303643 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:303643

Geef ons feedback

 

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