regexec вызывает ошибку malloc, размер поврежден по сравнению с prev_size - PullRequest
0 голосов
/ 23 сентября 2019

После нескольких итераций вызова regexec я получаю внутреннюю ошибку в relocxec для malloc.

Обычно в массиве тегов только один тег (reg exp), поэтому в следующем коде значение tagidx вцикл равен нулю.Пошаговое выполнение кода показывает правильное регулярное выражение

^\"(.+)\",\"(.+)\"$

И в буфере содержится символ с нулем в конце * (строка)

0x555555756160 <buffer> "\"PrimaryKey\",\"https://example.com/news/story/samplepage\""

Так что эта функция работает несколько раз, прежде чем в конечном итоге завершится с ошибкой:

поврежденный размер по сравнению с prev_size

Трассировка стека показывает ошибку изнутри malloc, вызванную из regexec.

Моя среда - Ubuntu 18.04, gcc 7.4.4.

void ProcessTags(FILE *infile, char *buffer, tag *tags)
{
  int tagcnt = sizeof(*tags)/sizeof(tag);
  int tagidx, errno;
  regex_t tagreg;
  regmatch_t matches[MAXMATCHES];

  for (tagidx = 0 ; tagidx < tagcnt ; tagidx++)
  {
    if((errno = regcomp(&tagreg, tags[tagidx].regexp, REG_EXTENDED)))
    {
      regerror(errno, &tagreg, errbuf, sizeof(errbuf));
      fprintf(stderr, "Regular expression problem with tag %s - %s : %s\n", tags[tagidx].tagname, tags[tagidx].regexp, errbuf);
    }

    if (regexec(&tagreg, buffer, MAXMATCHES, matches, 0) == 0) // SIGINT here!!!
    {
      switch (tags[tagidx].action)
      {
...
      }
    }

    regfree(&tagreg);
  }
}
...