ODE-1002: orEach: When counters are negative or too large an InvalidExpressionValue fault must be thrown
Project: http://git-wip-us.apache.org/repos/asf/ode/repo Commit: http://git-wip-us.apache.org/repos/asf/ode/commit/f901c37e Tree: http://git-wip-us.apache.org/repos/asf/ode/tree/f901c37e Diff: http://git-wip-us.apache.org/repos/asf/ode/diff/f901c37e Branch: refs/heads/master Commit: f901c37ecdce2a5578e29cc9413e1e65bc5539e3 Parents: 6ac86ca Author: Tammo van Lessen <[email protected]> Authored: Thu Aug 29 00:58:39 2013 +0200 Committer: Tammo van Lessen <[email protected]> Committed: Thu Aug 29 23:52:30 2013 +0200 ---------------------------------------------------------------------- .../org/apache/ode/bpel/runtime/FOREACH.java | 26 +++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ode/blob/f901c37e/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/FOREACH.java ---------------------------------------------------------------------- diff --git a/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/FOREACH.java b/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/FOREACH.java index 2d99054..2627a1c 100644 --- a/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/FOREACH.java +++ b/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/FOREACH.java @@ -183,13 +183,31 @@ public class FOREACH extends ACTIVITY { private int evaluateCondition(OExpression condition) throws FaultException { try { - return getBpelRuntimeContext().getExpLangRuntime(). + int cond = getBpelRuntimeContext().getExpLangRuntime(). evaluateAsNumber(condition, getEvaluationContext()).intValue(); + + if (cond < 0) { + String msg = "ForEach counter was negative."; + __log.error(msg); + throw new FaultException(_oforEach.getOwner().constants.qnInvalidExpressionValue,msg); + } + + if (cond > Integer.MAX_VALUE) { + // FIXME: this is not entirely correct. ODE uses an signed integer but the + // value range for the counters are xs:unsignedInt, which do not fit in + // an integer. To keep byte code compatibility, we can't easily change the type + // of the fields. But we can probably live with the limitation to only + // support Integer.MAX_VALUE as a maximum instead of Integer.MAX_VALUE * 2 - 1. + String msg = "ForEach counter was too large."; + __log.error(msg); + throw new FaultException(_oforEach.getOwner().constants.qnInvalidExpressionValue,msg); + } + + return cond; } catch (EvaluationException e) { - String msg; - msg = "ForEach counter value couldn't be evaluated as xs:unsignedInt."; + String msg = "ForEach counter value couldn't be evaluated as xs:unsignedInt."; __log.error(msg, e); - throw new FaultException(_oforEach.getOwner().constants.qnForEachCounterError,msg); + throw new FaultException(_oforEach.getOwner().constants.qnInvalidExpressionValue,msg); } }
