From a74094de9abd99a0835e97fda2f9120ef6ce105b Mon Sep 17 00:00:00 2001 From: Fabrizio Fabbri Date: Wed, 17 May 2017 23:20:10 +0200 Subject: [PATCH] fix coverity issue Missing varargs init or cleanup --- src/c/character.d | 1 + src/c/cinit.d | 3 +++ src/c/clos/gfun.d | 1 + src/c/error.d | 5 ++++- src/c/numbers/number_compare.d | 4 +++- src/c/numbers/number_equalp.d | 1 + src/c/package.d | 5 ++++- src/c/threads/process.d | 7 ++++++- src/c/threads/queue.d | 1 + src/h/internal.h | 4 +++- 10 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/c/character.d b/src/c/character.d index 62865a9a9..1717e8ae9 100644 --- a/src/c/character.d +++ b/src/c/character.d @@ -208,6 +208,7 @@ ecl_char_eq(cl_object x, cl_object y) if (ecl_char_eq(ecl_va_arg(ds), c)) { @(return ECL_NIL); } + ecl_va_end(ds); } @(return ECL_T); } @) diff --git a/src/c/cinit.d b/src/c/cinit.d index ae48978c5..10b822462 100644 --- a/src/c/cinit.d +++ b/src/c/cinit.d @@ -38,6 +38,7 @@ si_safe_eval(cl_narg narg, cl_object form, cl_object env, ...) cl_object err_value; va_list args; va_start(args, env); err_value = va_arg(args, cl_object); + va_end(args); return _ecl_funcall4(@'ext::safe-eval', form, env, err_value); } return _ecl_funcall3(@'ext::safe-eval', form, env); @@ -98,6 +99,7 @@ si_string_to_object(cl_narg narg, cl_object string, ...) cl_object err_value; va_list args; va_start(args, string); err_value = va_arg(args, cl_object); + va_end(args); return _ecl_funcall3(@'si::string-to-object', string, err_value); } return _ecl_funcall2(@'si::string-to-object', string); @@ -110,6 +112,7 @@ si_signal_simple_error(cl_narg narg, cl_object condition, cl_object continuable, cl_object rest; ecl_va_start(args, format_args, narg, 4); rest = cl_grab_rest_args(args); + ecl_va_end(args); return cl_apply(6, @'si::signal-simple-error', condition, continuable, format, format_args, rest); } diff --git a/src/c/clos/gfun.d b/src/c/clos/gfun.d index e02860a82..b68becda4 100644 --- a/src/c/clos/gfun.d +++ b/src/c/clos/gfun.d @@ -49,6 +49,7 @@ user_function_dispatch(cl_narg narg, ...) fun = fun->instance.slots[fun->instance.length - 1]; output = ecl_apply_from_stack_frame(frame, fun); ecl_stack_frame_close(frame); + ecl_va_end(args); return output; } diff --git a/src/c/error.d b/src/c/error.d index 76e28e824..8db46eb3b 100644 --- a/src/c/error.d +++ b/src/c/error.d @@ -104,12 +104,15 @@ void FEerror(const char *s, int narg, ...) { ecl_va_list args; + cl_object rest; ecl_va_start(args, narg, narg, 0); ecl_enable_interrupts(); + rest = cl_grab_rest_args(args); + ecl_va_end(args); funcall(4, @'si::universal-error-handler', ECL_NIL, /* not correctable */ make_constant_base_string(s), /* condition text */ - cl_grab_rest_args(args)); + rest); _ecl_unexpected_return(); } diff --git a/src/c/numbers/number_compare.d b/src/c/numbers/number_compare.d index 88a9d6db7..8293be4ec 100644 --- a/src/c/numbers/number_compare.d +++ b/src/c/numbers/number_compare.d @@ -208,7 +208,9 @@ monotonic(int s, int t, int narg, ecl_va_list nums) #define MONOTONIC(i, j) (cl_narg narg, ...) \ { ecl_va_list nums; ecl_va_start(nums, narg, narg, 0); \ - return monotonic(i, j, narg, nums); } + cl_object result = monotonic(i, j, narg, nums); \ + ecl_va_end(nums); \ + return result; } cl_object @<= MONOTONIC( 1, 0) cl_object @>= MONOTONIC(-1, 0) diff --git a/src/c/numbers/number_equalp.d b/src/c/numbers/number_equalp.d index 3fad40a16..ae9c91a7e 100644 --- a/src/c/numbers/number_equalp.d +++ b/src/c/numbers/number_equalp.d @@ -188,6 +188,7 @@ ecl_number_equalp(cl_object x, cl_object y) if (ecl_number_equalp(numi, ecl_va_arg(numb))) { @(return ECL_NIL); } + ecl_va_end(numb); } @(return ECL_T); @) diff --git a/src/c/package.d b/src/c/package.d index 2e8fe2038..28bab7b73 100644 --- a/src/c/package.d +++ b/src/c/package.d @@ -51,12 +51,15 @@ void CEpackage_error(const char *message, const char *continue_message, cl_object package, int narg, ...) { ecl_va_list args; + cl_object arg; ecl_va_start(args, narg, narg, 0); + arg = narg? cl_grab_rest_args(args) : cl_list(1,package); + ecl_va_end(args); si_signal_simple_error(6, @'package-error', make_constant_base_string(continue_message), make_constant_base_string(message), /* format control */ - narg? cl_grab_rest_args(args) : cl_list(1,package), + arg, @':package', package); } diff --git a/src/c/threads/process.d b/src/c/threads/process.d index a3bb9894d..645b3af72 100755 --- a/src/c/threads/process.d +++ b/src/c/threads/process.d @@ -439,6 +439,7 @@ mp_process_preset(cl_narg narg, cl_object process, cl_object function, ...) assert_type_process(process); process->process.function = function; process->process.args = cl_grab_rest_args(args); + ecl_va_end(args); @(return process); } @@ -644,6 +645,7 @@ cl_object mp_process_run_function(cl_narg narg, cl_object name, cl_object function, ...) { cl_object process; + cl_object rest; ecl_va_list args; ecl_va_start(args, function, narg, 2); if (narg < 2) @@ -653,8 +655,10 @@ mp_process_run_function(cl_narg narg, cl_object name, cl_object function, ...) } else { process = mp_make_process(2, @':name', name); } + rest = cl_grab_rest_args(args); + ecl_va_end(args); cl_apply(4, @'mp::process-preset', process, function, - cl_grab_rest_args(args)); + rest); return mp_process_enable(process); } @@ -672,6 +676,7 @@ mp_process_run_function_wait(cl_narg narg, ...) cl_sleep(wait); } } + ecl_va_end(args); @(return process); } diff --git a/src/c/threads/queue.d b/src/c/threads/queue.d index c10f5c444..2c41e4d2f 100755 --- a/src/c/threads/queue.d +++ b/src/c/threads/queue.d @@ -386,5 +386,6 @@ print_lock(char *prefix, cl_object l, ...) fflush(stdout); ecl_giveup_spinlock(&lock); } + va_end(args); } /*#define print_lock(a,b,c) (void)0*/ diff --git a/src/h/internal.h b/src/h/internal.h index f7209c22b..379a29422 100755 --- a/src/h/internal.h +++ b/src/h/internal.h @@ -194,6 +194,7 @@ extern cl_object si_constant_form_value _ECL_ARGS((cl_narg narg, cl_object form, va_list args; \ va_start(args, lastarg); \ frame->frame.base = (cl_object*)args; \ + va_end(args); \ } else { \ frame->frame.base = env->stack_top - narg; \ } @@ -207,7 +208,7 @@ extern cl_object si_constant_form_value _ECL_ARGS((cl_narg narg, cl_object form, frame->frame.t = t_frame; \ frame->frame.env = env; \ frame->frame.size = narg; \ - if (narg < ECL_C_ARGUMENTS_LIMIT) { \ + if (narg < ECL_C_ARGUMENTS_LIMIT) { \ cl_object *p = frame->frame.base = env->values; \ va_list args; \ va_start(args, lastarg); \ @@ -215,6 +216,7 @@ extern cl_object si_constant_form_value _ECL_ARGS((cl_narg narg, cl_object form, *p = va_arg(args, cl_object); \ ++p; \ } \ + va_end(args); \ frame->frame.stack = (cl_object*)0x1; \ } else { \ frame->frame.base = env->stack_top - narg; \