]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Fix mod_expr `clamp` function
authorTravis Cross <tc@traviscross.com>
Thu, 25 Dec 2014 10:11:47 +0000 (10:11 +0000)
committerTravis Cross <tc@traviscross.com>
Thu, 25 Dec 2014 10:18:31 +0000 (10:18 +0000)
The clamp(v,a,b) function wraps v around the interval [a,b).

However prior to this commit, `clamp` was ignoring the third argument
and using the second argument again in its place.  This resulted in a
division by zero.  Hence `clamp` didn't work at all.

Even if the arguments were treated correctly, `clamp` incorrectly
multiplied rather than added whenever v < a.  This would have produced
bogus results.  (Thanks to Shona McNeill for pointing this out.)

Note that as implemented, `clamp` is undefined for b >= a.

These errors are present in the last upstream C version, v2.7.
They've been corrected in the C++ version that upstream now maintains
instead.

Thanks-to: Shona McNeill <prufrax@googlemail.com>
FS-7070 #resolve

src/mod/applications/mod_expr/exprilfs.h

index ad2b5515e06430d8eed9f98e90ccc6c788f68cfc..7efc281c16ccb418b9adfac84c484d1a4672b176 100644 (file)
@@ -763,7 +763,7 @@ case EXPR_NODEFUNC_CLAMP:
                err = exprEvalNode(obj, nodes->data.function.nodes, 1, &d1);
 
        if (!err)
-               err = exprEvalNode(obj, nodes->data.function.nodes, 1, &d2);
+               err = exprEvalNode(obj, nodes->data.function.nodes, 2, &d2);
 
        if (!err) {
                EXPR_RESET_ERR();
@@ -771,7 +771,7 @@ case EXPR_NODEFUNC_CLAMP:
                EXPR_CHECK_ERR();
 
                if (tmp < 0.0)
-                       *val = tmp * d2;
+                       *val = tmp + d2;
                else
                        *val = tmp + d1;
        } else