Eli Mesika has uploaded a new change for review. Change subject: fixing integer out of range exception in search ......................................................................
fixing integer out of range exception in search The change [1] introduced to return all rows when max=-1 generates an integer overflow in the calculation of the indexes used for paging. For example, in an environment with one data center running a query with "page 2" generates the following error: <fault><reason>Operation Failed</reason><detail>statementcallback; sql [select * from (select * from storage pool where ( id in (select storage pool with storage domain.id from storage pool with storage domain )) order by name asc ) as t1 offset (-2147483648 -1) limit 2147483647]; error: integer out of range; nested exception is org.postgresql.util.psqlexception: error: integer out of range</detail></fault> The problem is in SyntaxChecker.java, in line 954, where we do the following: result = StringFormat.format(pagingSyntax, (page - 1) * syntax.getMaxCount() + 1, syntax.getMaxCount()); This multiplication results in Integer.MAX_VALUE + 1, which overflows the integer and results in the value -2147483648. This affect all uses of queries with paging. [1] http://gerrit.ovirt.org/21375 Change-Id: I518dfdfff93dde28d9741d5e333c695239b7e7d2 Signed-off-by: Eli Mesika <emes...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java M backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java 2 files changed, 10 insertions(+), 5 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/40/24240/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java index a2946aa..a6db6c8 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/SearchQuery.java @@ -359,7 +359,9 @@ SyntaxContainer searchObj = curSyntaxChecker.analyzeSyntaxState(searchText, true); // set the case-sensitive flag searchObj.setCaseSensitive(getParameters().getCaseSensitive()); - searchObj.setMaxCount(getParameters().getMaxCount() == -1 ? Integer.MAX_VALUE : getParameters().getMaxCount()); + int maxValue = Integer.MAX_VALUE; + // If a number > maxValue is given then maxValue will be used + searchObj.setMaxCount(getParameters().getMaxCount() == -1 ? maxValue : Math.min(maxValue, getParameters().getMaxCount())); // setting FromSearch value searchObj.setSearchFrom(getParameters().getSearchFrom()); diff --git a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java index da8be51..f1f8d34 100644 --- a/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java +++ b/backend/manager/modules/searchbackend/src/main/java/org/ovirt/engine/core/searchbackend/SyntaxChecker.java @@ -1,5 +1,6 @@ package org.ovirt.engine.core.searchbackend; +import java.math.BigInteger; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; @@ -954,15 +955,17 @@ PagingType pagingType = getPagingType(); if (pagingType != null) { String pagingSyntax = Config.<String> getValue(ConfigValues.DBPagingSyntax); + BigInteger bigPage = BigInteger.valueOf(page); + BigInteger bigCount = BigInteger.valueOf(syntax.getMaxCount()); + BigInteger bigX = bigPage.subtract(BigInteger.ONE).multiply(bigCount).add(BigInteger.ONE); + BigInteger bigY = bigPage.multiply(bigCount); switch (pagingType) { case Range: result = - StringFormat.format(pagingSyntax, - (page - 1) * syntax.getMaxCount() + 1, - page * syntax.getMaxCount()); + StringFormat.format(pagingSyntax, bigX, bigY); break; case Offset: - result = StringFormat.format(pagingSyntax, (page - 1) * syntax.getMaxCount() + 1, syntax.getMaxCount()); + result = StringFormat.format(pagingSyntax, bigX, bigCount); break; } } -- To view, visit http://gerrit.ovirt.org/24240 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I518dfdfff93dde28d9741d5e333c695239b7e7d2 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.4 Gerrit-Owner: Eli Mesika <emes...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches