Hi,

I discovered an overflow problem in SizeRequirements. I added a Mauve
test for that problem (to BoxLayout testsuite) and this patch makes this
test PASS.

2005-11-04  Roman Kennke  <[EMAIL PROTECTED]>

        * javax/swing/SizeRequirements.java
        (getTiledSizeRequirements): Added check for overflows.
        (adjustGreater): Fixed overflow handling through usage of long
        instead of int.

/Roman
Index: javax/swing/SizeRequirements.java
===================================================================
RCS file: /cvsroot/classpath/classpath/javax/swing/SizeRequirements.java,v
retrieving revision 1.19
diff -u -r1.19 SizeRequirements.java
--- javax/swing/SizeRequirements.java	13 Oct 2005 20:02:29 -0000	1.19
+++ javax/swing/SizeRequirements.java	4 Nov 2005 11:23:48 -0000
@@ -142,13 +142,26 @@
   public static SizeRequirements
   getTiledSizeRequirements(SizeRequirements[] children)
   {
-    SizeRequirements result = new SizeRequirements();
-    for (int i = 0; i < children.length; i++)
-      {
-        result.minimum += children[i].minimum;
-        result.preferred += children[i].preferred;
-        result.maximum += children[i].maximum;
-      }
+    long minimum = 0;
+    long preferred = 0;
+    long maximum = 0;
+    for (int i = 0; i < children.length; i++)
+      {
+        minimum += children[i].minimum;
+        preferred += children[i].preferred;
+        maximum += children[i].maximum;
+      }
+    // Overflow check.
+    if (minimum > Integer.MAX_VALUE)
+      minimum = Integer.MAX_VALUE;
+    if (preferred > Integer.MAX_VALUE)
+      preferred = Integer.MAX_VALUE;
+    if (maximum > Integer.MAX_VALUE)
+      maximum = Integer.MAX_VALUE;
+    SizeRequirements result = new SizeRequirements((int) minimum,
+                                                   (int) preferred,
+                                                   (int) maximum,
+                                                   0.5F);
     return result;
   }
 
@@ -338,12 +351,10 @@
                                     int[] spans, int span)
   {
     // Sum up (maxSize - prefSize) over all children
-    int sumDelta = 0;
+    long sumDelta = 0;
     for (int i = 0; i < children.length; i++)
       {
         sumDelta += children[i].maximum - children[i].preferred;
-        if (sumDelta < 0)
-          sumDelta = Integer.MAX_VALUE;
       }
 
     // If we have sumDelta == 0, then all components have prefSize == maxSize
@@ -356,7 +367,7 @@
       {
         double factor = ((double) (children[i].maximum - children[i].preferred))
                         / ((double) sumDelta);
-        spans[i] -= factor * (span - allocated);
+        spans[i] += factor * (allocated - span);
       }
   }
 
_______________________________________________
Classpath-patches mailing list
Classpath-patches@gnu.org
http://lists.gnu.org/mailman/listinfo/classpath-patches

Reply via email to