From 1b20769e5245165e9643a96407f27332569c17c7 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 27 Jul 2014 09:54:41 -0700 Subject: Fix 2014-02-05 safety regression: unchecked use of non-function objects in some contexts that require functions. * lib.c (funcall, funcall1, funcall2, funcall3, funcall4): check type(fun) before dereferencing to see whether there are optional args. --- ChangeLog | 9 +++++++++ lib.c | 10 +++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index c6799d32..8476aad0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2014-07-27 Kaz Kylheku + + Fix 2014-02-05 safety regression: unchecked use of non-function objects + in some contexts that require functions. + + * lib.c (funcall, funcall1, funcall2, funcall3, funcall4): + check type(fun) before dereferencing to see whether there + are optional args. + 2014-07-27 Kaz Kylheku * eval.c (giterate_func, giterate): New static functions. diff --git a/lib.c b/lib.c index 4cdb38ee..563da3a0 100644 --- a/lib.c +++ b/lib.c @@ -3726,7 +3726,7 @@ val generic_funcall(val fun, val arg[], int nargs) val funcall(val fun) { - if (fun->f.optargs || type(fun) != FUN) { + if (type(fun) != FUN || fun->f.optargs) { val arg[32] = { nil }; return generic_funcall(fun, arg, 0); } @@ -3757,7 +3757,7 @@ val funcall(val fun) val funcall1(val fun, val arg) { - if (fun->f.optargs || type(fun) != FUN) { + if (type(fun) != FUN || fun->f.optargs) { val args[32]; args[0] = arg; return generic_funcall(fun, args, 1); @@ -3793,7 +3793,7 @@ val funcall1(val fun, val arg) val funcall2(val fun, val arg1, val arg2) { - if (fun->f.optargs || type(fun) != FUN) { + if (type(fun) != FUN || fun->f.optargs) { val arg[32]; arg[0] = arg1; arg[1] = arg2; @@ -3835,7 +3835,7 @@ val funcall2(val fun, val arg1, val arg2) val funcall3(val fun, val arg1, val arg2, val arg3) { - if (fun->f.optargs || type(fun) != FUN) { + if (type(fun) != FUN || fun->f.optargs) { val arg[32]; arg[0] = arg1; arg[1] = arg2; @@ -3882,7 +3882,7 @@ val funcall3(val fun, val arg1, val arg2, val arg3) val funcall4(val fun, val arg1, val arg2, val arg3, val arg4) { - if (fun->f.optargs || type(fun) != FUN) { + if (type(fun) != FUN || fun->f.optargs) { val arg[32]; arg[0] = arg1; arg[1] = arg2; -- cgit v1.2.3