I have the following code that executes an invalid command inside fork. The following code returns a memory leak in valgrind.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <unistd.h>
int external_cmd(char **argv)
{
int pid;
if ((pid = fork()) == -1)
return -1;
if (pid == 0) {
execvp(argv[0], argv);
exit(0);
} else if (pid < 0)
return -1;
int status;
while (wait(&status) != pid);
return 0;
}
int main ()
{
char *argv[8] = {0};
argv[0] = "tawtaw";
argv[1] = "-a";
char *mem = strdup("anychar");
external_cmd(argv);
free(mem);
return(0);
}
executing the above code with valgrind return:
$ valgrind
==11573== Memcheck, a memory error detector
==11573== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==11573== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==11573== Command: ./test
==11573==
==11574==
==11574== HEAP SUMMARY:
==11574== in use at exit: 8 bytes in 1 blocks
==11574== total heap usage: 1 allocs, 0 frees, 8 bytes allocated
==11574==
==11574== 8 bytes in 1 blocks are still reachable in loss record 1 of 1
==11574== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11574== by 0x4EBF729: strdup (strdup.c:42)
==11574== by 0x400747: main (in /home/mohamed/Desktop/tech/test/test)
==11574==
==11574== LEAK SUMMARY:
==11574== definitely lost: 0 bytes in 0 blocks
==11574== indirectly lost: 0 bytes in 0 blocks
==11574== possibly lost: 0 bytes in 0 blocks
==11574== still reachable: 8 bytes in 1 blocks
==11574== suppressed: 0 bytes in 0 blocks
==11574==
==11574== For counts of detected and suppressed errors, rerun with: -v
==11574== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
==11573==
==11573== HEAP SUMMARY:
==11573== in use at exit: 0 bytes in 0 blocks
==11573== total heap usage: 1 allocs, 1 frees, 8 bytes allocated
==11573==
==11573== All heap blocks were freed
==11573==
==11573== For counts of detected and suppressed errors, rerun with: -v
==11573== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
NOTE. If I execute the code with a valid ls instead of tawtaw, then valgring will not return a memory leak.
What am I missing?
source
share