aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew G. Morgan <morgan@kernel.org>2021-07-15 19:41:36 -0700
committerAndrew G. Morgan <morgan@kernel.org>2021-07-15 19:41:36 -0700
commita28eac8c1ccee337676a01e0024882f6bfd30ba9 (patch)
treef04de58368628fc8e8c7bf243d27ed874b0d9616
parent3421fa5f5b5ecb6c8136c553cfa10c8ed6803610 (diff)
downloadlibcap-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.h13
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