[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