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

Reply via email to