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
[email protected]
http://lists.gnu.org/mailman/listinfo/classpath-patches