aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2014-11-09 18:25:42 -0500
committerJustin M. Keyes <justinkz@gmail.com>2014-11-09 18:25:42 -0500
commit8e281b3f70f92535925332207061385f4d1935bc (patch)
treea44efb7d6b16c9f91bcfd459be72d3b6fc916e91 /src
parent57140446174a1e547b4799d75d6182a24ad78b44 (diff)
parentdba8433723f1cb5dbfc7e09fde73219aba646f60 (diff)
downloadrneovim-8e281b3f70f92535925332207061385f4d1935bc.tar.gz
rneovim-8e281b3f70f92535925332207061385f4d1935bc.tar.bz2
rneovim-8e281b3f70f92535925332207061385f4d1935bc.zip
Merge pull request #1429 from oni-link/fix.job_start.leak
Fix memory leak in job_start().
Diffstat (limited to 'src')
-rw-r--r--src/nvim/msgpack_rpc/channel.c2
-rw-r--r--src/nvim/os/job.c4
-rw-r--r--src/nvim/os/wstream.c6
3 files changed, 9 insertions, 3 deletions
diff --git a/src/nvim/msgpack_rpc/channel.c b/src/nvim/msgpack_rpc/channel.c
index aa6008558f..da1dc8d1b5 100644
--- a/src/nvim/msgpack_rpc/channel.c
+++ b/src/nvim/msgpack_rpc/channel.c
@@ -119,7 +119,7 @@ void channel_teardown(void)
/// Creates an API channel by starting a job and connecting to its
/// stdin/stdout. stderr is forwarded to the editor error stream.
///
-/// @param argv The argument vector for the process
+/// @param argv The argument vector for the process. [consumed]
/// @return The channel id
uint64_t channel_from_job(char **argv)
{
diff --git a/src/nvim/os/job.c b/src/nvim/os/job.c
index 7ae2a86fc2..17872ab9c9 100644
--- a/src/nvim/os/job.c
+++ b/src/nvim/os/job.c
@@ -105,7 +105,8 @@ void job_teardown(void)
/// Tries to start a new job.
///
/// @param argv Argument vector for the process. The first item is the
-/// executable to run.
+/// executable to run.
+/// [consumed]
/// @param data Caller data that will be associated with the job
/// @param writable If true the job stdin will be available for writing with
/// job_write, otherwise it will be redirected to /dev/null
@@ -139,6 +140,7 @@ Job *job_start(char **argv,
if (i == MAX_RUNNING_JOBS) {
// No free slots
+ shell_free_argv(argv);
*status = 0;
return NULL;
}
diff --git a/src/nvim/os/wstream.c b/src/nvim/os/wstream.c
index a1f3612418..6a650ce775 100644
--- a/src/nvim/os/wstream.c
+++ b/src/nvim/os/wstream.c
@@ -230,7 +230,11 @@ static void write_cb(uv_write_t *req, int status)
if (data->wstream->freed && data->wstream->pending_reqs == 0) {
// Last pending write, free the wstream;
- free(data->wstream);
+ if (data->wstream->free_handle) {
+ uv_close((uv_handle_t *)data->wstream->stream, close_cb);
+ } else {
+ free(data->wstream);
+ }
}
kmp_free(WRequestPool, wrequest_pool, data);