diff options
author | Marius Halden <marius.h@lden.org> | 2015-10-29 01:38:28 +0100 |
---|---|---|
committer | Marius Halden <marius.h@lden.org> | 2015-10-29 01:38:28 +0100 |
commit | d4075740044d14b42071007fcfbbd584f6168ba9 (patch) | |
tree | d6071d6c43c11a5b7505d8599cc45b1eb5f61b7e | |
parent | 7a6bf50e8f83e3c5f82281b2042b5e70a6eff209 (diff) | |
download | piper-d4075740044d14b42071007fcfbbd584f6168ba9.tar.gz piper-d4075740044d14b42071007fcfbbd584f6168ba9.tar.bz2 piper-d4075740044d14b42071007fcfbbd584f6168ba9.tar.xz |
Make sure argv doesn't overflow
-rw-r--r-- | piper.c | 48 |
1 files changed, 40 insertions, 8 deletions
@@ -68,28 +68,46 @@ failx(int exit, const char *msg, ...) } void +grow_argv(char ***argv, size_t *len) +{ +#define GROW_SIZE 32 + + char **ret = realloc(*argv, sizeof(char *) * (*len + GROW_SIZE)); + if (ret == NULL) + err(1, "realloc"); + + *argv = ret; + *len += GROW_SIZE; + +#undef GROW_SIZE +} + +void gen_argv(struct proc *proc) { - int i; char *saveptr, *tmp, *cmd; - char **argv, **head; + char **argv = NULL, **head; + + size_t len = 0, used = 0; - // XXX: Check for overflow in argv - argv = malloc(sizeof(char*) * 1024); - if (argv == NULL) - err(1, "malloc"); cmd = strdup(proc->cmd); if (cmd == NULL) err(1, "strdup"); + grow_argv(&argv, &len); head = argv; - for (i = 0; i < 1024; i++) - argv[i] = NULL; tmp = strtok_r(cmd, " \t", &saveptr); while (tmp != NULL) { *(head++) = strdup(tmp); + used++; + + if (used >= len) { + grow_argv(&argv, &len); + head = argv + used; + } + tmp = strtok_r(NULL, " \t", &saveptr); } *head = NULL; @@ -219,6 +237,20 @@ start_missing_procs() } } +void +print_argv() +{ + int i; + for (i = 0; i < NUM_PROCS; i++) { + char **tmp = procs[i].argv; + + while (*tmp) + printf("%s ", *tmp++); + + printf("\n"); + } +} + int main(int argc, char **argv) { |