summaryrefslogtreecommitdiffstats
path: root/stream.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2015-03-11 06:29:46 -0700
committerKaz Kylheku <kaz@kylheku.com>2015-03-11 06:29:46 -0700
commit62e9321f4511bd4e1c1c0142767d5fa2eec07d59 (patch)
tree83e7862b5b59350b6b6d280e7d6d5d33e38db8b3 /stream.c
parent89e46f760a11140db3cc4a4becd7a6941989c89a (diff)
downloadtxr-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.
Diffstat (limited to 'stream.c')
-rw-r--r--stream.c16
1 files changed, 6 insertions, 10 deletions
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;