summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--lib.c10
2 files changed, 14 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index c6799d32..8476aad0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,14 @@
2014-07-27 Kaz Kylheku <kaz@kylheku.com>
+ 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 <kaz@kylheku.com>
+
* eval.c (giterate_func, giterate): New static functions.
(eval_init): Registered giterate as intrinsic.
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;