Author: mbrohl
Date: Sun Jun 21 16:32:05 2015
New Revision: 1686741
URL: http://svn.apache.org/r1686741
Log:
Applied patch for OFBIZ-6522: Potential IndexOutOfBoundsException in
CategoryServices.getProductCategoryAndLimitedMembers.
If view indexes as input parameters of service
getProductCategoryAndLimitedMembers get manipulated (e.g. by manipulating URL
params or bookmarking an URL with those params and come back later), it can
lead to an IndexOutOfBoundsException because of a lowIndex greater list size.
The highIndex is checked for that, the lowIndex is not.
Thanks Martin Becker for reporting the issue and providing the patch.
Modified:
ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java
Modified:
ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java?rev=1686741&r1=1686740&r2=1686741&view=diff
==============================================================================
---
ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java
(original)
+++
ofbiz/trunk/applications/product/src/org/ofbiz/product/category/CategoryServices.java
Sun Jun 21 16:32:05 2015
@@ -269,7 +269,8 @@ public class CategoryServices {
lowIndex = 0;
highIndex = 0;
}
- Boolean filterOutOfStock = false ;
+
+ boolean filterOutOfStock = false;
try {
String productStoreId = (String) context.get("productStoreId");
if (UtilValidate.isNotEmpty(productStoreId)) {
@@ -281,8 +282,10 @@ public class CategoryServices {
} catch (GenericEntityException e) {
Debug.logWarning(e.getMessage(), module);
}
+
List<GenericValue> productCategoryMembers = null;
if (productCategory != null) {
+ EntityListIterator pli = null;
try {
if (useCacheForMembers) {
productCategoryMembers =
EntityQuery.use(delegator).from(entityName).where("productCategoryId",
productCategoryId).orderBy(orderByFields).cache(true).queryList();
@@ -309,22 +312,26 @@ public class CategoryServices {
} catch (GeneralException e) {
Debug.logWarning("Problem filtering out of stock
products :"+e.getMessage(), module);
}
-
}
// filter out the view allow before getting the sublist
if (UtilValidate.isNotEmpty(viewProductCategoryId)) {
productCategoryMembers =
CategoryWorker.filterProductsInCategory(delegator, productCategoryMembers,
viewProductCategoryId);
- listSize = productCategoryMembers.size();
}
// set the index and size
- listSize = productCategoryMembers.size();
- if (highIndex > listSize) {
- highIndex = listSize;
- }
-
- // get only between low and high indexes
+ listSize = productCategoryMembers.size();
if (limitView) {
+ // limit high index to (filtered) listSize
+ if (highIndex > listSize) {
+ highIndex = listSize;
+ }
+ // if lowIndex > listSize, the input is wrong => reset
to first page
+ if (lowIndex > listSize) {
+ viewIndex = 0;
+ lowIndex = 1;
+ highIndex = Math.min(viewSize, highIndex);
+ }
+ // get only between low and high indexes
if (UtilValidate.isNotEmpty(productCategoryMembers)) {
productCategoryMembers =
productCategoryMembers.subList(lowIndex-1, highIndex);
}
@@ -349,7 +356,7 @@ public class CategoryServices {
// set distinct on
// using list iterator
- EntityListIterator pli =
EntityQuery.use(delegator).from(entityName).where(mainCond).orderBy(orderByFields).cursorScrollInsensitive().maxRows(highIndex).queryIterator();
+ pli =
EntityQuery.use(delegator).from(entityName).where(mainCond).orderBy(orderByFields).cursorScrollInsensitive().maxRows(highIndex).queryIterator();
// get the partial list for this page
if (limitView) {
@@ -372,13 +379,12 @@ public class CategoryServices {
}
} else {
productCategoryMembers =
pli.getPartialList(lowIndex, viewSize);
-
listSize = pli.getResultsSizeAfterPartialList();
}
} else {
productCategoryMembers = pli.getCompleteList();
if (UtilValidate.isNotEmpty(viewProductCategoryId)) {
- // fiter out the view allow
+ // filter out the view allow
productCategoryMembers =
CategoryWorker.filterProductsInCategory(delegator, productCategoryMembers,
viewProductCategoryId);
}
@@ -386,6 +392,7 @@ public class CategoryServices {
lowIndex = 1;
highIndex = listSize;
}
+
// filter out of stock products
if (filterOutOfStock) {
try {
@@ -395,6 +402,7 @@ public class CategoryServices {
Debug.logWarning("Problem filtering out of stock
products :"+e.getMessage(), module);
}
}
+
// null safety
if (productCategoryMembers == null) {
productCategoryMembers = new
LinkedList<GenericValue>();
@@ -403,13 +411,20 @@ public class CategoryServices {
if (highIndex > listSize) {
highIndex = listSize;
}
-
- // close the list iterator
- pli.close();
}
} catch (GenericEntityException e) {
Debug.logError(e, module);
}
+ finally {
+ // close the list iterator, if used
+ if (pli != null) {
+ try {
+ pli.close();
+ } catch (GenericEntityException e) {
+ Debug.logError(e, module);
+ }
+ }
+ }
}
Map<String, Object> result = new HashMap<String, Object>();