Martin Mucha has uploaded a new change for review.

Change subject: core: error in calculating number of available macs / trimming 
mac pool ranges
......................................................................

core: error in calculating number of available macs / trimming mac pool ranges

mac ranges was trimmed to inapproriate size; it was trimmed so that
first and last mac representation can 'fit' into int datatype, but
that rendered unable to fit *count* of macs in such range into int
datatype, since that count would then be max_int+1 and that'd cause
overflow.

Bug-Url: https://bugzilla.redhat.com/1162077
Change-Id: I4bbf719deb47c795862a03deb515283b1eae9a0e
Signed-off-by: Martin Mucha <mmu...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/Range.java
M 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/RangeTest.java
M 
backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java
M 
backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/MacAddressRangeUtilsTest.java
4 files changed, 36 insertions(+), 4 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/30/35130/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/Range.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/Range.java
index 3a7dea5..6f3adfe 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/Range.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/Range.java
@@ -4,6 +4,8 @@
 import java.util.BitSet;
 import java.util.List;
 
+import org.apache.commons.lang.Validate;
+
 class Range {
     private final long rangeStart;
     private final long rangeEnd;
@@ -20,7 +22,13 @@
         this.rangeStart = rangeStart;
         this.rangeEnd = rangeEnd;
 
-        int numberOfMacs = (int) (rangeEnd - rangeStart) + 1;
+        long numberOfMacsLong =  (rangeEnd - rangeStart) + 1;
+        Validate.isTrue(numberOfMacsLong <= Integer.MAX_VALUE,
+                String.format("Range too big; Range shouldn't be bigger than 
%1$s, but passed one "
+                        + "contains %2$s elements.", Integer.MAX_VALUE, 
numberOfMacsLong));
+
+        int numberOfMacs = (int) numberOfMacsLong;
+
         this.availableMacsCount = numberOfMacs;
         this.usedMacs = new BitSet(numberOfMacs);
     }
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/RangeTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/RangeTest.java
index 77eb526..e8238b8 100644
--- 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/RangeTest.java
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/RangeTest.java
@@ -5,8 +5,10 @@
 
 import java.util.List;
 
+import org.apache.commons.lang.math.LongRange;
 import org.junit.Before;
 import org.junit.Test;
+import org.ovirt.engine.core.utils.MacAddressRangeUtils;
 
 public class RangeTest {
 
@@ -108,4 +110,26 @@
     public void testAllocateMacNoEnoughMacs() throws Exception {
         rangeOf10Macs.allocateMacs(NUMBER_OF_MACS + 1);
     }
+
+    @Test
+    public void testRangeStartAndRangeStopAreInclusive() throws Exception {
+        assertThat(new Range(MAC_FROM_RANGE, 
MAC_FROM_RANGE).getAvailableCount(), is(1));
+    }
+
+    @Test
+    public void testRangeCanContainOnlyIntSizeNumberOfElements() throws 
Exception {
+        LongRange longRange = MacAddressRangeUtils.clipRange(new LongRange(0, 
Long.MAX_VALUE));
+        Range range = new Range(longRange.getMinimumLong(), 
longRange.getMaximumLong());
+        assertThat(range.getAvailableCount(), is(Integer.MAX_VALUE));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testTooBigRange() throws Exception {
+        new Range(0, Integer.MAX_VALUE);
+    }
+
+    @Test
+    public void testMaxSizeRange() throws Exception {
+        new Range(0, Integer.MAX_VALUE - 1);
+    }
 }
diff --git 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java
 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java
index e43863d..3beb76b 100644
--- 
a/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java
+++ 
b/backend/manager/modules/utils/src/main/java/org/ovirt/engine/core/utils/MacAddressRangeUtils.java
@@ -65,7 +65,7 @@
         return result;
     }
 
-    private static LongRange clipRange(Range range) {
+    public static LongRange clipRange(Range range) {
         long rangeEnd = range.getMaximumLong();
         long rangeStart = range.getMinimumLong();
 
@@ -75,7 +75,7 @@
             trimmingOccurred = true;
         }
 
-        final long trimmedRangeEnd = Math.min(rangeStart + Integer.MAX_VALUE, 
rangeEnd);
+        final long trimmedRangeEnd = Math.min(rangeStart + Integer.MAX_VALUE - 
1, rangeEnd);
         if (rangeEnd != trimmedRangeEnd) {
             rangeEnd = trimmedRangeEnd;
             trimmingOccurred = true;
diff --git 
a/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/MacAddressRangeUtilsTest.java
 
b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/MacAddressRangeUtilsTest.java
index 405b0c4..fdcbecf 100644
--- 
a/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/MacAddressRangeUtilsTest.java
+++ 
b/backend/manager/modules/utils/src/test/java/org/ovirt/engine/core/utils/MacAddressRangeUtilsTest.java
@@ -43,7 +43,7 @@
         String start = "00:1a:4a:01:00:00";
         String end = "00:FF:FF:FF:FF:FF";
         final long expectedStart = MacAddressRangeUtils.macToLong(start);
-        final long expectedEnd = MacAddressRangeUtils.macToLong(start) + 
Integer.MAX_VALUE;
+        final long expectedEnd = MacAddressRangeUtils.macToLong(start) + 
Integer.MAX_VALUE - 1;
 
         testRange(start, end, expectedStart, expectedEnd);
     }


-- 
To view, visit http://gerrit.ovirt.org/35130
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4bbf719deb47c795862a03deb515283b1eae9a0e
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Martin Mucha <mmu...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to