[devel] libxml2 bug#24379
Sergei Epiphanov
serpiph на nikiet.ru
Чт Дек 30 13:58:48 UTC 2010
Что же до libxml2, то меня смущает это кусок в error.c (последний if):
...
void XMLCDECL
__xmlRaiseError(xmlStructuredErrorFunc schannel,
xmlGenericErrorFunc channel, void *data, void *ctx,
void *nod, int domain, int code, xmlErrorLevel level,
const char *file, int line, const char *str1,
const char *str2, const char *str3, int int1, int col,
<------> const char *msg, ...)
{
xmlParserCtxtPtr ctxt = NULL;
xmlNodePtr node = (xmlNodePtr) nod;
char *str = NULL;
xmlParserInputPtr input = NULL;
xmlErrorPtr to = &xmlLastError;
xmlNodePtr baseptr = NULL;
if ((xmlGetWarningsDefaultValue == 0) && (level == XML_ERR_WARNING))
return;
if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) ||
(domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) ||
<------>(domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) {
<------>ctxt = (xmlParserCtxtPtr) ctx;
//Вот этот if
<------>if ((schannel == NULL) && (ctxt != NULL) && (ctxt->sax != NULL) &&
<------> (ctxt->sax->initialized == XML_SAX2_MAGIC))
<------> schannel = ctxt->sax->serror;
}
...
При вызове этой функции из предложенного testcase получается, то schannel
выставляется, а data (которая при вызове равна NULL) - нет. После этого всё
остальное и идёт лесом, так как schannel != NULL, все проверки обламываются до
пункта
...
if (schannel != NULL) {
schannel(data, to);
<------>return;
}
...
После чего вызывается callback-функция с data == NULL и получаем этот момент.
В том странном if, похоже, нет установки:
if(data == NULL) {
data = ctxt->user_data;
}
или чего-то подобного.
--
С уважением, Епифанов Сергей
Подробная информация о списке рассылки Devel