From 62e9321f4511bd4e1c1c0142767d5fa2eec07d59 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 11 Mar 2015 06:29:46 -0700 Subject: * stream.c (open_process, run, sh): Eliminate utf8name local variable and associated memory leak. Correctly allocate only nargs + 1 elements for argv array, not nargs + 2. --- ChangeLog | 6 ++++++ stream.c | 16 ++++++---------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0bfc6592..811376a7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-03-11 Kaz Kylheku + + * stream.c (open_process, run): Eliminate utf8name local variable + and associated memory leak. Correctly allocate only nargs + 1 elements + for argv array, not nargs + 2. + 2015-03-10 Kaz Kylheku * sysif.c (mkdir_nothrow_exists): New static function. diff --git a/stream.c b/stream.c index 95aafb41..b29098a0 100644 --- a/stream.c +++ b/stream.c @@ -2230,7 +2230,7 @@ val open_process(val name, val mode_str, val args) int input = equal(mode_str, lit("r")) || equal(mode_str, lit("rb")); int fd[2]; pid_t pid; - char **argv = 0, *utf8name = 0; + char **argv = 0; val iter; int i, nargs; @@ -2242,7 +2242,7 @@ val open_process(val name, val mode_str, val args) name, num(errno), string_utf8(strerror(errno)), nao); } - argv = coerce(char **, chk_malloc((nargs + 2) * sizeof *argv)); + argv = coerce(char **, chk_malloc((nargs + 1) * sizeof *argv)); for (i = 0, iter = cons(name, args); iter; i++, iter = cdr(iter)) { val arg = car(iter); @@ -2250,8 +2250,6 @@ val open_process(val name, val mode_str, val args) } argv[i] = 0; - utf8name = utf8_dup_to(c_str(name)); - pid = fork(); if (pid == -1) { @@ -2275,7 +2273,7 @@ val open_process(val name, val mode_str, val args) close(fd[1]); } - execvp(utf8name, argv); + execvp(argv[0], argv); _exit(errno); } else { int whichfd; @@ -2393,14 +2391,14 @@ static val sh(val command) static val run(val name, val args) { pid_t pid; - char **argv = 0, *utf8name = 0; + char **argv = 0; val iter; int i, nargs; args = default_bool_arg(args); nargs = c_num(length(args)) + 1; - argv = coerce(char **, chk_malloc((nargs + 2) * sizeof *argv)); + argv = coerce(char **, chk_malloc((nargs + 1) * sizeof *argv)); for (i = 0, iter = cons(name, args); iter; i++, iter = cdr(iter)) { val arg = car(iter); @@ -2408,8 +2406,6 @@ static val run(val name, val args) } argv[i] = 0; - utf8name = utf8_dup_to(c_str(name)); - pid = fork(); if (pid == -1) { @@ -2421,7 +2417,7 @@ static val run(val name, val args) } if (pid == 0) { - execvp(utf8name, argv); + execvp(argv[0], argv); _exit(errno); } else { int status; -- cgit v1.2.3