execv и тестирование правильных абсолютных путей - PullRequest
0 голосов
/ 27 сентября 2011

Я пытаюсь проверить абсолютные пути на машине с Linux, чтобы найти, где находится программа, чтобы я мог запустить ее с моими конкретными аргументами.Проблема в том, что, когда я нахожу это, я продолжаю добавлять больше строк к правильному пути, а также утечку памяти, освобождая динамически распределенную память.Единственное исправление для дампа стека - это не освобождение (ret).На основании gdb я полагаю, что когда я запускаю пример с «ls», он находит программу и запускает ее, но дает странные результаты.

  for(j = 0; j < i; j++, path = NULL)
  {
  token = strtok_r(path, delim, &saver);
  if(token == NULL)
    break;
  else
    {
      strncat(ret, token, 80);
      strncat(ret, "/", 1);
      strncat(ret, command, 80);
      args[0] = ret;
      printf("%s\n", ret);
      m = execv(ret, args);
      printf("%d\n", m);
      if(m < 0)
        {
          free(ret);
          ret = malloc(120*sizeof(char));
        }
      else
      break;
    }
}

Где символ разделителя - двоеточие (:)strncat сделан правильно.Хотя я не уверен, так что спасибо за помощь.

1 Ответ

0 голосов
/ 27 сентября 2011

Каждый раз, когда вы malloc(), вы получаете новую неинициализированную память. strncat() вызовет ошибку сегментации, поскольку попытается найти NUL-символ в ret, который может быть далеко за пределами ваших 120 байтов для ret.

Либо замените malloc на calloc, либо используйте memset(ret, 0, 120*sizeof(char)); после того, как вы позвоните malloc. Или как-то заполнить ret нулями до первого strncat.

Причина, по которой он не ломается, если вы не освобождаете , может быть вызван объявлением ret в стеке - тогда не освобождает / блокирует его. Или может случиться так, что начальное значение ret будет равным нулю, но последующие вызовы malloc приведут к неинициализированной памяти.

PS: Вы уверены, что хотите использовать execv? Это заменяет текущий процесс. Но я предполагаю, что вы вилка.

...