0

I'm trying to test absolute paths on a linux machine to find where a program is located so I can run it with my specific arguments. The problem is, when I find it, I keep adding more strings to the correct path as well as memory leak by freeing the dynamically allocated memory. Only fix for the stack dump is to not free(ret). I believe based on gdb that when I run an example with "ls" it finds the program and runs it, but gives strange results.

  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;
    }
}

Where the delimiter character is a colon (:) and I believe the strncat is done correctly. I'm not sure though so thanks for the help.

GFXGunblade
  • 97
  • 3
  • 10
  • Please post the minimal, complete and working code example that can be used to reproduce the problem. It is not clear from the code you have provided where the bug is. For example, do you initialize `ret` somehow before entering a loop? If not - there you go. –  Sep 27 '11 at 01:42

1 Answers1

0

Each time you malloc(), you get new uninitialised memory. strncat() will then raise a segmentation fault as it will try to find a NUL character in ret, which could be way outside of your 120 bytes for ret.

Either replace malloc with calloc, or use memset(ret, 0, 120*sizeof(char)); after you call malloc. Or somehow fill ret with zeros before the first strncat.

The reason it's not breaking if you don't free could be due to ret being declared on the stack - then do not free/malloc it. Or it could so happen that the initial value of ret is all zeros - but subsequent malloc calls yield uninitialised memory.

PS: Are you sure you want to use execv? That replaces the current process. But I assume you fork.

evgeny
  • 2,564
  • 17
  • 27