Повреждение кучи во время проверки схемы SAX с помощью MSXML6

Я считаю, что обнаружил сценарий проверки, который вызывает повреждение кучи в MSXML6.

Я использовал MSXML6 ISAXXMLReader для проверки xml на соответствие схеме xsd в моем приложении. Сценарий, который вызывает проблему, — это когда у вас есть несколько ссылок на IDREF, который не найден в документе XML. Любопытно, что наличие только одной ссылки не вызывает проблемы. Например, со следующей схемой:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
<xs:element name="Example">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="ExampleElement" type="xs:IDREF" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="IDElement" type="xs:ID" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

Этот пример XML возвращает ожидаемое сообщение проверки:

example_good.xml

<Example>
<ExampleElement>ID1</ExampleElement>
</Example>

выход:

Parsing document: example_good.xml

Error Message:
The ID 'ID1' is referenced but not defined in the document.

Error Message:
Validate failed.

Parse result code: c00ce225

Однако, если у вас есть два идентификатора, на которые ссылаются, которые не найдены, читатель SAX возвратит следующее сообщение об ошибке:

example_bad.xml

<Example>
<ExampleElement>ID1</ExampleElement>
<ExampleElement>ID1</ExampleElement>
</Example>

выход:

Parsing document: example_bad.xml

Error Message:
System error: -1072898003.

Error Message:
Validate failed.

Parse result code: c00ce225

В дополнение к этому, позже при выполнении моей программы (в совершенно другой DLL) при остановке потока все приложение завершится с ошибкой повреждения кучи.

Чтобы изолировать причину проблемы, я сделал простую клиентскую версию валидатора SAX. Моя реализация очень похожа на пример на мсдн.

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <objbase.h>

#if _WIN32
#import <msxml6.dll> no_auto_exclude
#else
#import <msxml6.dll>
#endif

#include "SAXErrorHandlerImpl.h"
int _tmain(int argc, _TCHAR* argv[])
{
if (argc<2) {
printf("\nTo run, enter\n\tSaxJumpStart file:///drive:/path/file.xml\n\n");
return 0;   // Need URL to read
}

CoInitialize(NULL);
ISAXXMLReader* pRdr = NULL;

HRESULT hr = CoCreateInstance(
__uuidof(SAXXMLReader60),
NULL,
CLSCTX_ALL,
__uuidof(ISAXXMLReader),
(void **)&pRdr);

if (!FAILED(hr))
{
// Set IATA namespace for NDC transactions and path to schema file
_bstr_t bstrNamespace = L"";
_bstr_t bstrPath = "Example.xsd";

// Configure Schema Cache
MSXML2::IXMLDOMSchemaCollectionPtr pXS;
pXS.CreateInstance(__uuidof(XMLSchemaCache60), NULL, CLSCTX_INPROC_SERVER);
pXS->add(bstrNamespace, bstrPath);

// Configure SAX Reader for schema validation
hr = pRdr->putFeature(L"schema-validation", VARIANT_TRUE);
hr = pRdr->putFeature(L"exhaustive-errors", VARIANT_TRUE);  // Show just one or all errors
hr = pRdr->putProperty(L"schemas", _variant_t(pXS.GetInterfacePtr()));

// Set error handler
SAXErrorHandlerImpl * pEc = new SAXErrorHandlerImpl();
hr = pRdr->putErrorHandler(pEc);

printf("\nParsing document: %S\n", argv[1]);

hr = pRdr->parseURL(argv[1]);
printf("\nParse result code: %08x\n\n", hr);

pRdr->Release();
}
else
{
printf("\nError %08X\n\n", hr);
}

CoUninitialize();
return 0;
}

Когда я запускаю это с помощью Application Verifier, происходит сбой функции pRdr-> parseURL (). Это выходные данные приложения Verirfier:

<avrf:logfile xmlns:avrf="Application Verifier">
<avrf:logSession TimeStarted="2018-05-11 : 16:18:34" PID="29252" Version="2">
<avrf:logEntry Time="2018-05-11 : 16:18:35" LayerName="Heaps" StopCode="0x13" Severity="Error">
<avrf:message>First chance access violation for current stack trace.</avrf:message>
<avrf:parameter1>d25afc8 - Invalid address causing the exception.</avrf:parameter1>
<avrf:parameter2>fc63f35 - Code address executing the invalid access.</avrf:parameter2>
<avrf:parameter3>9bf4e8 - Exception record.</avrf:parameter3>
<avrf:parameter4>9bf538 - Context record.</avrf:parameter4>
<avrf:stackTrace>
<avrf:trace>vrfcore!VerifierDisableVerifier+708 ( @ 0)</avrf:trace>
<avrf:trace>verifier!VerifierStopMessage+74 ( @ 0)</avrf:trace>
<avrf:trace>ntdll!RtlApplicationVerifierStop+7d ( @ 0)</avrf:trace>
<avrf:trace>vfbasics!+fa57160 ( @ 0)</avrf:trace>
<avrf:trace>vfbasics!+fa587e8 ( @ 0)</avrf:trace>
<avrf:trace>vfbasics!+fa58134 ( @ 0)</avrf:trace>
<avrf:trace>ntdll!WinSqmEventWrite+1d1ee ( @ 0)</avrf:trace>
<avrf:trace>ntdll!RtlUnwind+1ba ( @ 0)</avrf:trace>
<avrf:trace>ntdll!KiUserExceptionDispatcher+f ( @ 0)</avrf:trace>
<avrf:trace>msxml6!StartUI+5e0a2 ( @ 0)</avrf:trace>
<avrf:trace>msxml6!StartUI+3c6a5 ( @ 0)</avrf:trace>
<avrf:trace>msxml6!StartUI+89e4a ( @ 0)</avrf:trace>
<avrf:trace>msxml6!StartUI+8a707 ( @ 0)</avrf:trace>
<avrf:trace>msxml6!StartUI+8b76e ( @ 0)</avrf:trace>
<avrf:trace>msxml6!StartUI+9f12a ( @ 0)</avrf:trace>
<avrf:trace>SAXErrorHandling!wmain+2ff (c:\users\rmelrose\documents\visual studio 2015\projects\schemalocationproj\schemalocationproj\saxval.cpp @ 57)</avrf:trace>
<avrf:trace>SAXErrorHandling!invoke_main+1e (f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl @ 79)</avrf:trace>
<avrf:trace>SAXErrorHandling!__scrt_common_main_seh+150 (f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl @ 253)</avrf:trace>
<avrf:trace>SAXErrorHandling!__scrt_common_main+d (f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl @ 296)</avrf:trace>
<avrf:trace>SAXErrorHandling!wmainCRTStartup+8 (f:\dd\vctools\crt\vcstartup\src\startup\exe_wmain.cpp @ 17)</avrf:trace>
<avrf:trace>KERNEL32!BaseThreadInitThunk+24 ( @ 0)</avrf:trace>
<avrf:trace>ntdll!RtlSubscribeWnfStateChangeNotification+439 ( @ 0)</avrf:trace>
<avrf:trace>ntdll!RtlSubscribeWnfStateChangeNotification+404 ( @ 0)</avrf:trace>
</avrf:stackTrace>
</avrf:logEntry>
</avrf:logSession>
</avrf:logfile>

Это проблема с MSXML6 или как я его использую?

Могу ли я что-нибудь сделать, чтобы предотвратить сбой моего приложения?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]