Я использую libxml2 (libxml2-2.7.8)
Я получаю сбой, когда я вызываю xmlFreeTextReader после обработки файла XMl.
Я не имею ни малейшего представления о том, почему это происходит:
Ниже приведен код, который я использую:
int parseDevDescMessage(char *buffer, DMXDevice *dmxLocal)
{
//xmlDocPtr xmlDocPointer;
xmlTextReaderPtr xmlTextPointer;
int errorCode=0;
const xmlChar *name, *value;
char *xmlBuffer;
xmlNode *rootElement = NULL;
xmlNode *currentNode = NULL;
devServices *devServicesLocal=NULL;
devServices *devServicesLocalAdd=NULL;
/*
* This initialize the library and check potential ABI mismatches
* between the version it was compiled for and the actual shared
* library used.
*/
LIBXML_TEST_VERSION
xmlBuffer = (char *)malloc(strlen(buffer));
strcpy(xmlBuffer, buffer, strlen(buffer));
/*I am doing this string copy because the variable buffer is referred in the calling function. I am assuming that xmlFreeTextReader is freeing the buffer also
xmlTextPointer = xmlReaderForMemory(xmlBuffer, strlen(xmlBuffer), "somthing.xml", NULL, 0);
if(xmlTextPointer == NULL)
{
#ifdef CTL_MSG_PARSER_DEBUG_NEW
printf("parseDevDescMessage : ERROR WHITE CREATING XML DOC FROM MEM\n");
#endif
errorCode = -1;
goto error;
}
errorCode = xmlTextReaderRead(xmlTextPointer);
while(errorCode == 1)
{
if( ( (strcmp(xmlTextReaderConstName(xmlTextPointer),"serviceList")) == 0 ) &&
( (xmlTextReaderNodeType(xmlTextPointer)) == 1)
)
{
errorCode = xmlTextReaderRead(xmlTextPointer);
while(errorCode == 1)
{
if( ( (strcmp(xmlTextReaderConstName(xmlTextPointer),"service")) == 0) &&
( (xmlTextReaderNodeType(xmlTextPointer)) == 1)
)
{
devServicesLocal = dmxLocal->deviceServices;
if(!devServicesLocal)
{
devServicesLocal = (devServices *)malloc(sizeof(devServices));
memset(devServicesLocal, 0, sizeof(devServices));
dmxLocal->deviceServices = devServicesLocal;
//devServicesLocalAdd = devServicesLocal;
}
else
{
while(devServicesLocal->nextService)
{
devServicesLocal = devServicesLocal->nextService;
}
devServicesLocal->nextService = (devServices *)malloc(sizeof(devServices));
memset(devServicesLocal->nextService, 0, sizeof(devServices));
devServicesLocal = devServicesLocal->nextService;
}
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
value = xmlTextReaderConstValue(xmlTextPointer);
devServicesLocal->serviceType = (char *)malloc(strlen(value));
strcpy(devServicesLocal->serviceType, value);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
value = xmlTextReaderConstValue(xmlTextPointer);
devServicesLocal->serviceId = (char *)malloc(strlen(value));
strcpy(devServicesLocal->serviceId, value);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
value = xmlTextReaderConstValue(xmlTextPointer);
devServicesLocal->SCPDURL = (char *)malloc(strlen(value));
strcpy(devServicesLocal->SCPDURL, value);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
value = xmlTextReaderConstValue(xmlTextPointer);
devServicesLocal->eventSubURL = (char *)malloc(strlen(value));
strcpy(devServicesLocal->eventSubURL, value);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
errorCode = xmlTextReaderRead(xmlTextPointer);
value = xmlTextReaderConstValue(xmlTextPointer);
devServicesLocal->controlURL = (char *)malloc(strlen(value));
strcpy(devServicesLocal->controlURL, value);
}
else
{
errorCode = xmlTextReaderRead(xmlTextPointer);
}
}
}
else
{
errorCode = xmlTextReaderRead(xmlTextPointer);
}
}
error:
xmlMemoryDump();
**xmlFreeTextReader(xmlTextPointer);**
xmlCleanupParser();
return errorCode;
}
Может кто-нибудь объяснить, почему происходит сбой этого кода при вызове xmlFreeTextReader (xmlTextPointer)