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

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.

303643
Dit artikel is gearchiveerd. Het wordt aangeboden in de huidige vorm en wordt niet meer bijgewerkt.
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 deMicrosoft 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;}// 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. 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.

Waarschuwing: dit artikel is automatisch vertaald

Eigenschappen

Artikel-id: 303643 - Laatst bijgewerkt: 02/24/2014 17:51:07 - Revisie: 2.0

  • Microsoft Data Access Components 2.6
  • Microsoft Data Access Components 2.7
  • kbnosurvey kbarchive kbhotfixserver kbqfe kbbug kbfix kbmdac260sp2fix kbmt KB303643 KbMtnl
Feedback