diff options
author | Andrew G. Morgan <morgan@kernel.org> | 2021-07-15 19:41:36 -0700 |
---|---|---|
committer | Andrew G. Morgan <morgan@kernel.org> | 2021-07-15 19:41:36 -0700 |
commit | a28eac8c1ccee337676a01e0024882f6bfd30ba9 (patch) | |
tree | f04de58368628fc8e8c7bf243d27ed874b0d9616 | |
parent | 3421fa5f5b5ecb6c8136c553cfa10c8ed6803610 (diff) | |
download | libcap2-a28eac8c1ccee337676a01e0024882f6bfd30ba9.tar.gz |
Clean up allocated memory.
Deliberately free memory when appropriate as a normal part of
executing a .so object.
Signed-off-by: Andrew G. Morgan <morgan@kernel.org>
-rw-r--r-- | libcap/execable.h | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/libcap/execable.h b/libcap/execable.h index 3dff1e9..282402f 100644 --- a/libcap/execable.h +++ b/libcap/execable.h @@ -35,11 +35,15 @@ static void __execable_parse_args(int *argc_p, char ***argv_p) char *mem = NULL, *p; size_t size = 32, offset; for (offset=0; ; size *= 2) { - mem = realloc(mem, size+1); - if (mem == NULL) { + char *new_mem = realloc(mem, size+1); + if (new_mem == NULL) { perror("unable to parse arguments"); + if (mem != NULL) { + free(mem); + } exit(1); } + mem = new_mem; offset += fread(mem+offset, 1, size-offset, f); if (offset < size) { size = offset; @@ -54,6 +58,7 @@ static void __execable_parse_args(int *argc_p, char ***argv_p) argv = calloc(argc+1, sizeof(char *)); if (argv == NULL) { perror("failed to allocate memory for argv"); + free(mem); exit(1); } for (p=mem, argc=0, offset=0; offset < size; argc++) { @@ -79,6 +84,10 @@ void __so_start(void) \ char **argv; \ __execable_parse_args(&argc, &argv); \ __execable_main(argc, argv); \ + if (argc != 0) { \ + free(argv[0]); \ + free(argv); \ + } \ exit(0); \ } \ static void __execable_main |