libxml2: xmlFreeTextReader аварийно завершает работу - PullRequest
0 голосов
/ 25 февраля 2011

Я использую 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)

1 Ответ

0 голосов
/ 25 февраля 2011

Я использовал VALGRIND и обнаружил ряд проблем с памятью. Я поочередно исправил все проблемы, связанные с памятью, и в итоге этот сбой исчез. Может быть, в каком-то месте из-за повреждения этой памяти, из-за которого, когда это было выпущено, это терпело крах.

Спасибо

-Sun

...