api: fix leak when a api function is incorrectly called with a list.

This applies both to msgpack-rpc and eval.
This commit is contained in:
Björn Linse 2016-07-16 16:51:56 +02:00
parent 98a08c3e5a
commit acb7c826b3
4 changed files with 9 additions and 10 deletions

View File

@ -293,14 +293,8 @@ for i = 1, #functions do
if fn.return_type ~= 'void' then
output:write('\n ret = '..string.upper(real_type(fn.return_type))..'_OBJ(rv);')
end
-- Now generate the cleanup label for freeing memory allocated for the
-- arguments
output:write('\n\ncleanup:');
for j = 1, #fn.parameters do
local param = fn.parameters[j]
output:write('\n api_free_'..string.lower(real_type(param[1]))..'(arg_'..j..');')
end
output:write('\n return ret;\n}\n\n');
end
end

View File

@ -7140,8 +7140,7 @@ static void api_wrapper(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
end:
// All arguments were freed already, but we still need to free the array
xfree(args.items);
api_free_array(args);
api_free_object(result);
}

View File

@ -465,8 +465,7 @@ static void on_request_event(void **argv)
} else {
api_free_object(result);
}
// All arguments were freed already, but we still need to free the array
xfree(args.items);
api_free_array(args);
decref(channel);
xfree(e);
}

View File

@ -303,4 +303,11 @@ describe('vim_* functions', function()
eq(false, status)
ok(err:match('Invalid option name') ~= nil)
end)
it("doesn't leak memory on incorrect argument types", function()
local status, err = pcall(nvim, 'change_directory',{'not', 'a', 'dir'})
eq(false, status)
ok(err:match(': Wrong type for argument 1, expecting String') ~= nil)
end)
end)