From 2f2fb827c6d7e549472da9a469a7e8b0dd896d4d Mon Sep 17 00:00:00 2001 From: CF Mitrah Date: Wed, 18 Aug 2021 20:08:00 +0530 Subject: [PATCH] Added a fix to Bit functions throws an error for large integer input in LDEV-3666 --- .../src/main/java/lucee/runtime/functions/math/BitAnd.java | 6 +++++- .../java/lucee/runtime/functions/math/BitMaskClear.java | 6 ++++-- .../java/lucee/runtime/functions/math/BitMaskRead.java | 7 ++++--- .../main/java/lucee/runtime/functions/math/BitMaskSet.java | 6 ++++-- .../src/main/java/lucee/runtime/functions/math/BitNot.java | 5 ++++- core/src/main/java/lucee/runtime/functions/math/BitOr.java | 6 +++++- .../main/java/lucee/runtime/functions/math/BitSHLN.java | 4 +++- .../main/java/lucee/runtime/functions/math/BitSHRN.java | 4 +++- .../src/main/java/lucee/runtime/functions/math/BitXor.java | 6 +++++- 9 files changed, 37 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/lucee/runtime/functions/math/BitAnd.java b/core/src/main/java/lucee/runtime/functions/math/BitAnd.java index 00d368419d..217147bf39 100644 --- a/core/src/main/java/lucee/runtime/functions/math/BitAnd.java +++ b/core/src/main/java/lucee/runtime/functions/math/BitAnd.java @@ -22,10 +22,14 @@ package lucee.runtime.functions.math; import lucee.runtime.PageContext; +import lucee.runtime.op.Decision; +import lucee.runtime.exp.FunctionException; import lucee.runtime.ext.function.Function; public final class BitAnd implements Function { - public static double call(PageContext pc, double number, double number2) { + public static double call(PageContext pc, double number, double number2) throws FunctionException { + if (!Decision.isInteger(number)) throw new FunctionException(pc, "bitAnd", 1, "number1", "value [" + number + "] must be between the integer range"); + if (!Decision.isInteger(number2)) throw new FunctionException(pc, "bitAnd", 2, "number2", "value [" + number + "] must be between the integer range"); return (int) number & (int) number2; } } \ No newline at end of file diff --git a/core/src/main/java/lucee/runtime/functions/math/BitMaskClear.java b/core/src/main/java/lucee/runtime/functions/math/BitMaskClear.java index 9da6e749b2..85ef1bc242 100644 --- a/core/src/main/java/lucee/runtime/functions/math/BitMaskClear.java +++ b/core/src/main/java/lucee/runtime/functions/math/BitMaskClear.java @@ -22,6 +22,7 @@ package lucee.runtime.functions.math; import lucee.runtime.PageContext; +import lucee.runtime.op.Decision; import lucee.runtime.exp.FunctionException; import lucee.runtime.ext.function.Function; @@ -30,8 +31,9 @@ public static double call(PageContext pc, double dnumber, double dstart, double int number = (int) dnumber, start = (int) dstart, length = (int) dlength; - if (start > 31 || start < 0) throw new FunctionException(pc, "bitMaskClear", 2, "start", "must be beetween 0 and 31 now " + start); - if (length > 31 || length < 0) throw new FunctionException(pc, "bitMaskClear", 3, "length", "must be beetween 0 and 31 now " + length); + if(!Decision.isInteger(dnumber)) throw new FunctionException(pc, "bitMaskClear", 1, "number", "value [" + dnumber + "] must be between the integer range"); + if (start > 31 || start < 0) throw new FunctionException(pc, "bitMaskClear", 2, "start", "must be between 0 and 31 now " + start); + if (length > 31 || length < 0) throw new FunctionException(pc, "bitMaskClear", 3, "length", "must be between 0 and 31 now " + length); return number & ~((1 << length) - 1 << start); } diff --git a/core/src/main/java/lucee/runtime/functions/math/BitMaskRead.java b/core/src/main/java/lucee/runtime/functions/math/BitMaskRead.java index 079b7ef24a..ae16eea926 100644 --- a/core/src/main/java/lucee/runtime/functions/math/BitMaskRead.java +++ b/core/src/main/java/lucee/runtime/functions/math/BitMaskRead.java @@ -22,6 +22,7 @@ package lucee.runtime.functions.math; import lucee.runtime.PageContext; +import lucee.runtime.op.Decision; import lucee.runtime.exp.FunctionException; import lucee.runtime.ext.function.Function; @@ -30,9 +31,9 @@ public final class BitMaskRead implements Function { public static double call(PageContext pc, double dnumber, double dstart, double dlength) throws FunctionException { int number = (int) dnumber, start = (int) dstart, length = (int) dlength; - - if (start > 31 || start < 0) throw new FunctionException(pc, "bitMaskRead", 2, "start", "must be beetween 0 and 31 now " + start); - if (length > 31 || length < 0) throw new FunctionException(pc, "bitMaskRead", 3, "length", "must be beetween 0 and 31 now " + length); + if(!Decision.isInteger(dnumber)) throw new FunctionException(pc, "bitMaskRead", 1, "number", "value [" + dnumber + "] must be between the integer range"); + if (start > 31 || start < 0) throw new FunctionException(pc, "bitMaskRead", 2, "start", "must be between 0 and 31 now " + start); + if (length > 31 || length < 0) throw new FunctionException(pc, "bitMaskRead", 3, "length", "must be between 0 and 31 now " + length); return number >> start & (1 << length) - 1; } diff --git a/core/src/main/java/lucee/runtime/functions/math/BitMaskSet.java b/core/src/main/java/lucee/runtime/functions/math/BitMaskSet.java index aab0004261..c89072a87b 100644 --- a/core/src/main/java/lucee/runtime/functions/math/BitMaskSet.java +++ b/core/src/main/java/lucee/runtime/functions/math/BitMaskSet.java @@ -22,6 +22,7 @@ package lucee.runtime.functions.math; import lucee.runtime.PageContext; +import lucee.runtime.op.Decision; import lucee.runtime.exp.FunctionException; import lucee.runtime.ext.function.Function; @@ -31,8 +32,9 @@ public static double call(PageContext pc, double dnumber, double dmask, double d int number = (int) dnumber, mask = (int) dmask, start = (int) dstart, length = (int) dlength; - if (start > 31 || start < 0) throw new FunctionException(pc, "bitMaskSet", 2, "start", "must be beetween 0 and 31 now " + start); - if (length > 31 || length < 0) throw new FunctionException(pc, "bitMaskSet", 3, "length", "must be beetween 0 and 31 now " + length); + if(!Decision.isInteger(dnumber)) throw new FunctionException(pc, "bitMaskSet", 1, "number", "value [" + dnumber + "] must be between the integer range"); + if (start > 31 || start < 0) throw new FunctionException(pc, "bitMaskSet", 2, "start", "must be between 0 and 31 now " + start); + if (length > 31 || length < 0) throw new FunctionException(pc, "bitMaskSet", 3, "length", "must be between 0 and 31 now " + length); int tmp = (1 << length) - 1 << start; mask &= (1 << length) - 1; diff --git a/core/src/main/java/lucee/runtime/functions/math/BitNot.java b/core/src/main/java/lucee/runtime/functions/math/BitNot.java index fa2022ee68..e18948e2ae 100644 --- a/core/src/main/java/lucee/runtime/functions/math/BitNot.java +++ b/core/src/main/java/lucee/runtime/functions/math/BitNot.java @@ -22,10 +22,13 @@ package lucee.runtime.functions.math; import lucee.runtime.PageContext; +import lucee.runtime.op.Decision; +import lucee.runtime.exp.FunctionException; import lucee.runtime.ext.function.Function; public final class BitNot implements Function { - public static double call(PageContext pc, double number) { + public static double call(PageContext pc, double number) throws FunctionException { + if (!Decision.isInteger(number)) throw new FunctionException(pc, "bitNot", 1, "number", "value [" + number + "] must be between the integer range"); return ~(int) number; } } \ No newline at end of file diff --git a/core/src/main/java/lucee/runtime/functions/math/BitOr.java b/core/src/main/java/lucee/runtime/functions/math/BitOr.java index 0c8fe7b0ef..58be1ed517 100644 --- a/core/src/main/java/lucee/runtime/functions/math/BitOr.java +++ b/core/src/main/java/lucee/runtime/functions/math/BitOr.java @@ -22,10 +22,14 @@ package lucee.runtime.functions.math; import lucee.runtime.PageContext; +import lucee.runtime.op.Decision; +import lucee.runtime.exp.FunctionException; import lucee.runtime.ext.function.Function; public final class BitOr implements Function { - public static double call(PageContext pc, double number, double number2) { + public static double call(PageContext pc, double number, double number2) throws FunctionException { + if (!Decision.isInteger(number)) throw new FunctionException(pc, "bitOr", 1, "number1", "value [" + number + "] must be between the integer range"); + if (!Decision.isInteger(number2)) throw new FunctionException(pc, "bitOr", 2, "number2", "value [" + number + "] must be between the integer range"); return (int) number | (int) number2; } } \ No newline at end of file diff --git a/core/src/main/java/lucee/runtime/functions/math/BitSHLN.java b/core/src/main/java/lucee/runtime/functions/math/BitSHLN.java index 070435a7c3..5db7837c89 100644 --- a/core/src/main/java/lucee/runtime/functions/math/BitSHLN.java +++ b/core/src/main/java/lucee/runtime/functions/math/BitSHLN.java @@ -22,13 +22,15 @@ package lucee.runtime.functions.math; import lucee.runtime.PageContext; +import lucee.runtime.op.Decision; import lucee.runtime.exp.FunctionException; import lucee.runtime.ext.function.Function; public final class BitSHLN implements Function { public static double call(PageContext pc, double dnumber, double dcount) throws FunctionException { int number = (int) dnumber, count = (int) dcount; - if (count > 31 || count < 0) throw new FunctionException(pc, "bitSHLN", 2, "count", "must be beetween 0 and 31 now " + count); + if(!Decision.isInteger(dnumber)) throw new FunctionException(pc, "bitSHLN", 1, "number", "value [" + dnumber + "] must be between the integer range"); + if (count > 31 || count < 0) throw new FunctionException(pc, "bitSHLN", 2, "count", "must be between 0 and 31 now " + count); // TODO use bigInteger to shift further return number << count; } diff --git a/core/src/main/java/lucee/runtime/functions/math/BitSHRN.java b/core/src/main/java/lucee/runtime/functions/math/BitSHRN.java index 9518a2e4a4..03421e7f5b 100644 --- a/core/src/main/java/lucee/runtime/functions/math/BitSHRN.java +++ b/core/src/main/java/lucee/runtime/functions/math/BitSHRN.java @@ -22,6 +22,7 @@ package lucee.runtime.functions.math; import lucee.runtime.PageContext; +import lucee.runtime.op.Decision; import lucee.runtime.exp.FunctionException; import lucee.runtime.ext.function.Function; @@ -29,7 +30,8 @@ public final class BitSHRN implements Function { public static double call(PageContext pc, double dnumber, double dcount) throws FunctionException { int number = (int) dnumber, count = (int) dcount; - if (count > 31 || count < 0) throw new FunctionException(pc, "bitSHRN", 2, "count", "must be beetween 0 and 31 now " + count); + if(!Decision.isInteger(dnumber)) throw new FunctionException(pc, "bitSHRN", 1, "number", "value [" + dnumber + "] must be between the integer range"); + if (count > 31 || count < 0) throw new FunctionException(pc, "bitSHRN", 2, "count", "must be between 0 and 31 now " + count); return number >>> count; } diff --git a/core/src/main/java/lucee/runtime/functions/math/BitXor.java b/core/src/main/java/lucee/runtime/functions/math/BitXor.java index c67b7f49a9..821dafd4a8 100644 --- a/core/src/main/java/lucee/runtime/functions/math/BitXor.java +++ b/core/src/main/java/lucee/runtime/functions/math/BitXor.java @@ -22,10 +22,14 @@ package lucee.runtime.functions.math; import lucee.runtime.PageContext; +import lucee.runtime.op.Decision; +import lucee.runtime.exp.FunctionException; import lucee.runtime.ext.function.Function; public final class BitXor implements Function { - public static double call(PageContext pc, double number, double number2) { + public static double call(PageContext pc, double number, double number2) throws FunctionException { + if (!Decision.isInteger(number)) throw new FunctionException(pc, "bitXor", 1, "number1", "value [" + number + "] must be between the integer range"); + if (!Decision.isInteger(number2)) throw new FunctionException(pc, "bitXor", 1, "number2", "value [" + number + "] must be between the integer range"); return (int) number ^ (int) number2; } } \ No newline at end of file