diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2015-03-11 06:29:46 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2015-03-11 06:29:46 -0700 |
commit | 62e9321f4511bd4e1c1c0142767d5fa2eec07d59 (patch) | |
tree | 83e7862b5b59350b6b6d280e7d6d5d33e38db8b3 | |
parent | 89e46f760a11140db3cc4a4becd7a6941989c89a (diff) | |
download | txr-62e9321f4511bd4e1c1c0142767d5fa2eec07d59.tar.gz txr-62e9321f4511bd4e1c1c0142767d5fa2eec07d59.tar.bz2 txr-62e9321f4511bd4e1c1c0142767d5fa2eec07d59.zip |
* 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.
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | stream.c | 16 |
2 files changed, 12 insertions, 10 deletions
@@ -1,3 +1,9 @@ +2015-03-11 Kaz Kylheku <kaz@kylheku.com> + + * 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 <kaz@kylheku.com> * sysif.c (mkdir_nothrow_exists): New static function. @@ -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; |