summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2014-07-27 09:54:41 -0700
committerKaz Kylheku <kaz@kylheku.com>2014-07-27 09:54:41 -0700
commit1b20769e5245165e9643a96407f27332569c17c7 (patch)
treeb2d4713abcba86bb577eb8d462993594c4e3e5ee
parenta78684b08ea0669262156c78e9b8eb4bc68e8139 (diff)
downloadtxr-1b20769e5245165e9643a96407f27332569c17c7.tar.gz
txr-1b20769e5245165e9643a96407f27332569c17c7.tar.bz2
txr-1b20769e5245165e9643a96407f27332569c17c7.zip
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.
-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;