This is an automated email from the ASF dual-hosted git repository.
pjfanning pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/poi.git
The following commit(s) were added to refs/heads/trunk by this push:
new f9741a0c08 more int overflow risks (#1100)
f9741a0c08 is described below
commit f9741a0c084f4d034ccdc470000f8917c9225d7f
Author: PJ Fanning <[email protected]>
AuthorDate: Mon Jun 1 20:02:19 2026 +0100
more int overflow risks (#1100)
---
poi/src/main/java/org/apache/poi/hssf/record/FeatHdrRecord.java | 2 +-
.../java/org/apache/poi/hssf/usermodel/EscherGraphics2d.java | 7 ++++---
poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFSheet.java | 3 ++-
poi/src/main/java/org/apache/poi/sl/draw/DrawPaint.java | 5 ++++-
poi/src/main/java/org/apache/poi/sl/draw/PathGradientPaint.java | 4 +++-
poi/src/main/java/org/apache/poi/sl/image/ImageHeaderBitmap.java | 5 +++--
poi/src/main/java/org/apache/poi/sl/image/ImageHeaderEMF.java | 3 ++-
poi/src/main/java/org/apache/poi/sl/usermodel/Insets2D.java | 3 ++-
.../main/java/org/apache/poi/ss/format/CellNumberFormatter.java | 2 +-
poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java | 4 ++--
.../java/org/apache/poi/ss/formula/atp/YearFracCalculator.java | 9 +++++----
poi/src/main/java/org/apache/poi/ss/usermodel/DateUtil.java | 2 +-
12 files changed, 30 insertions(+), 19 deletions(-)
diff --git a/poi/src/main/java/org/apache/poi/hssf/record/FeatHdrRecord.java
b/poi/src/main/java/org/apache/poi/hssf/record/FeatHdrRecord.java
index d758339576..c923bd11c8 100644
--- a/poi/src/main/java/org/apache/poi/hssf/record/FeatHdrRecord.java
+++ b/poi/src/main/java/org/apache/poi/hssf/record/FeatHdrRecord.java
@@ -103,7 +103,7 @@ public final class FeatHdrRecord extends StandardRecord {
out.writeShort(isf_sharedFeatureType);
out.writeByte(reserved);
- out.writeInt((int)cbHdrData);
+ out.writeInt(Math.toIntExact(cbHdrData));
out.write(rgbHdrData);
}
diff --git
a/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics2d.java
b/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics2d.java
index f8a5ad8692..c8e6197138 100644
--- a/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics2d.java
+++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/EscherGraphics2d.java
@@ -156,7 +156,7 @@ public final class EscherGraphics2d extends Graphics2D {
int width = 0;
if (_stroke != null && _stroke instanceof BasicStroke) {
- width = (int) ((BasicStroke)_stroke).getLineWidth() * 12700;
+ width =
MathUtil.safeDoubleToInt(((BasicStroke)_stroke).getLineWidth() * 12700);
}
drawLine(MathUtil.safeDoubleToInt(shape2d.getX1()),
MathUtil.safeDoubleToInt(shape2d.getY1()),
MathUtil.safeDoubleToInt(shape2d.getX2()),
MathUtil.safeDoubleToInt(shape2d.getY2()), width);
@@ -249,7 +249,7 @@ public final class EscherGraphics2d extends Graphics2D {
{
int width = 0;
if (_stroke != null && _stroke instanceof BasicStroke) {
- width = (int) ((BasicStroke)_stroke).getLineWidth() * 12700;
+ width =
MathUtil.safeDoubleToInt(((BasicStroke)_stroke).getLineWidth() * 12700);
}
getEscherGraphics().drawLine(x1,y1,x2,y2, width);
// draw(new GeneralPath(new java.awt.geom.Line2D.Float(x1, y1, x2,
y2)));
@@ -312,7 +312,8 @@ public final class EscherGraphics2d extends Graphics2D {
@Override
public void drawString(String string, float x, float y)
{
- getEscherGraphics().drawString(string, (int)x, (int)y);
+ getEscherGraphics().drawString(
+ string, MathUtil.safeFloatToInt(x),
MathUtil.safeFloatToInt(y));
}
@Override
diff --git a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
index e66d574e50..f6310ceb2d 100644
--- a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
+++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
@@ -85,6 +85,7 @@ import org.apache.poi.ss.util.SheetUtil;
import org.apache.poi.util.Beta;
import org.apache.poi.util.Configurator;
import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
import org.apache.poi.util.Removal;
import static java.lang.System.currentTimeMillis;
@@ -2303,7 +2304,7 @@ public final class HSSFSheet implements Sheet {
if (width > maxColumnWidth) {
width = maxColumnWidth;
}
- setColumnWidth(column, (int) (width));
+ setColumnWidth(column, MathUtil.safeDoubleToInt(width));
}
}
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/DrawPaint.java
b/poi/src/main/java/org/apache/poi/sl/draw/DrawPaint.java
index d8e4ecebd0..5ccdf8c2b5 100644
--- a/poi/src/main/java/org/apache/poi/sl/draw/DrawPaint.java
+++ b/poi/src/main/java/org/apache/poi/sl/draw/DrawPaint.java
@@ -312,7 +312,10 @@ public class DrawPaint {
break;
}
- final BufferedImage img = new
BufferedImage((int)(width*flipX), (int)(height*flipY),
BufferedImage.TYPE_INT_ARGB);
+ final BufferedImage img = new BufferedImage(
+ MathUtil.safeDoubleToInt(width*flipX),
+ MathUtil.safeDoubleToInt(height*flipY),
+ BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
g.drawImage(image, 0, 0, null);
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/PathGradientPaint.java
b/poi/src/main/java/org/apache/poi/sl/draw/PathGradientPaint.java
index a3fbfec096..8fd5ecf57a 100644
--- a/poi/src/main/java/org/apache/poi/sl/draw/PathGradientPaint.java
+++ b/poi/src/main/java/org/apache/poi/sl/draw/PathGradientPaint.java
@@ -185,7 +185,9 @@ public class PathGradientPaint implements Paint {
}
ColorModel cm = getColorModel();
- raster =
cm.createCompatibleWritableRaster((int)deviceBounds.getWidth(),
(int)deviceBounds.getHeight());
+ raster = cm.createCompatibleWritableRaster(
+ MathUtil.safeDoubleToInt(deviceBounds.getWidth()),
+ MathUtil.safeDoubleToInt(deviceBounds.getHeight()));
BufferedImage img = new BufferedImage(cm, raster, false, null);
Graphics2D graphics = img.createGraphics();
graphics.setRenderingHints(hints);
diff --git a/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderBitmap.java
b/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderBitmap.java
index 352ebecd65..f85d34ff29 100644
--- a/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderBitmap.java
+++ b/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderBitmap.java
@@ -27,6 +27,7 @@ import
org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
import org.apache.logging.log4j.Logger;
import org.apache.poi.logging.PoiLogManager;
import org.apache.poi.util.Internal;
+import org.apache.poi.util.MathUtil;
import org.apache.poi.util.Units;
@Internal
@@ -46,8 +47,8 @@ public class ImageHeaderBitmap {
size = (img == null)
? new Dimension(200,200)
: new Dimension(
- (int)Units.pixelToPoints(img.getWidth()),
- (int)Units.pixelToPoints(img.getHeight())
+ MathUtil.safeDoubleToInt(Units.pixelToPoints(img.getWidth())),
+ MathUtil.safeDoubleToInt(Units.pixelToPoints(img.getHeight()))
);
}
diff --git a/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderEMF.java
b/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderEMF.java
index 7c3a577e31..3c71e0d6d6 100644
--- a/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderEMF.java
+++ b/poi/src/main/java/org/apache/poi/sl/image/ImageHeaderEMF.java
@@ -38,7 +38,8 @@ public class ImageHeaderEMF {
public ImageHeaderEMF(final byte[] data, final int off) {
int offset = off;
- int type = (int)LittleEndian.getUInt(data, offset); offset += 4;
+ int type = Math.toIntExact(LittleEndian.getUInt(data, offset));
+ offset += 4;
if (type != 1) {
LOG.atWarn().log("Invalid EMF picture - invalid type");
deviceBounds = new Rectangle(0,0,200,200);
diff --git a/poi/src/main/java/org/apache/poi/sl/usermodel/Insets2D.java
b/poi/src/main/java/org/apache/poi/sl/usermodel/Insets2D.java
index 2b79390be3..ee03647087 100644
--- a/poi/src/main/java/org/apache/poi/sl/usermodel/Insets2D.java
+++ b/poi/src/main/java/org/apache/poi/sl/usermodel/Insets2D.java
@@ -18,6 +18,7 @@
package org.apache.poi.sl.usermodel;
import org.apache.poi.common.Duplicatable;
+import org.apache.poi.util.MathUtil;
/**
* This is a replacement for {@link java.awt.Insets} which works on doubles
@@ -113,7 +114,7 @@ public final class Insets2D implements Duplicatable {
double val1 = sum1 * (sum1 + 1)/2 + left;
double val2 = sum2 * (sum2 + 1)/2 + top;
double sum3 = val1 + val2;
- return (int)(sum3 * (sum3 + 1)/2 + val2);
+ return MathUtil.safeDoubleToInt((sum3 * (sum3 + 1)/2 + val2));
}
/**
diff --git
a/poi/src/main/java/org/apache/poi/ss/format/CellNumberFormatter.java
b/poi/src/main/java/org/apache/poi/ss/format/CellNumberFormatter.java
index 11b08e927f..d27d8dea69 100644
--- a/poi/src/main/java/org/apache/poi/ss/format/CellNumberFormatter.java
+++ b/poi/src/main/java/org/apache/poi/ss/format/CellNumberFormatter.java
@@ -686,7 +686,7 @@ public class CellNumberFormatter extends CellFormatter {
// the "fractional % 1" captures integer values in improper
fractions
if (fractional == 0 || (improperFraction && fractional % 1 == 0)) {
// 0 as a fraction is reported by excel as 0/1
- n = (int) Math.round(fractional);
+ n = Math.toIntExact(Math.round(fractional));
d = 1;
} else {
SimpleFraction frac =
SimpleFraction.buildFractionMaxDenominator(fractional, maxDenominator);
diff --git a/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
b/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
index cea6c2bbb7..5c821cda8b 100644
--- a/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
+++ b/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
@@ -86,7 +86,7 @@ public class SimpleFraction {
// check for (almost) integer arguments, which should not go
// to iterations.
if (Math.abs(a0 - value) < epsilon) {
- return new SimpleFraction((int)a0, 1);
+ return new SimpleFraction(Math.toIntExact(a0), 1);
}
long p0 = 1;
@@ -109,7 +109,7 @@ public class SimpleFraction {
if (epsilon == 0.0f && maxDenominator > 0 && Math.abs(q2) >
maxDenominator &&
Math.abs(q1) < maxDenominator){
- return new SimpleFraction((int)p1, (int)q1);
+ return new SimpleFraction(Math.toIntExact(p1),
Math.toIntExact(q1));
}
if ((p2 > overflow) || (q2 > overflow)) {
throw new IllegalStateException("Overflow trying to convert
"+value+" to fraction ("+p2+"/"+q2+")");
diff --git
a/poi/src/main/java/org/apache/poi/ss/formula/atp/YearFracCalculator.java
b/poi/src/main/java/org/apache/poi/ss/formula/atp/YearFracCalculator.java
index ea477bd01f..f2d2184cc8 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/atp/YearFracCalculator.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/atp/YearFracCalculator.java
@@ -24,6 +24,7 @@ import org.apache.poi.ss.formula.eval.EvaluationException;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.util.Internal;
import org.apache.poi.util.LocaleUtil;
+import org.apache.poi.util.MathUtil;
/**
@@ -60,8 +61,8 @@ final class YearFracCalculator {
// common logic for all bases
// truncate day values
- int startDateVal = (int) Math.floor(pStartDateVal);
- int endDateVal = (int) Math.floor(pEndDateVal);
+ int startDateVal = MathUtil.safeDoubleToInt(Math.floor(pStartDateVal));
+ int endDateVal = MathUtil.safeDoubleToInt(Math.floor(pEndDateVal));
if (startDateVal == endDateVal) {
// when dates are equal, result is zero
return 0;
@@ -250,7 +251,7 @@ final class YearFracCalculator {
long msDiff = endDateMS - startDateMS;
// some extra checks to make sure we don't hide some other bug with
the rounding
- int remainderHours = (int) ((msDiff % MS_PER_DAY) / MS_PER_HOUR);
+ int remainderHours = Math.toIntExact((msDiff % MS_PER_DAY) /
MS_PER_HOUR);
switch (remainderHours) {
case 0: // normal case
break;
@@ -261,7 +262,7 @@ final class YearFracCalculator {
throw new IllegalStateException("Unexpected date diff between
" + startDateMS + " and " + endDateMS);
}
- return (int) (0.5 + ((double)msDiff / MS_PER_DAY));
+ return MathUtil.safeDoubleToInt((0.5 + ((double)msDiff / MS_PER_DAY)));
}
private static double averageYearLength(int startYear, int endYear) {
diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/DateUtil.java
b/poi/src/main/java/org/apache/poi/ss/usermodel/DateUtil.java
index edff23219e..5977314576 100644
--- a/poi/src/main/java/org/apache/poi/ss/usermodel/DateUtil.java
+++ b/poi/src/main/java/org/apache/poi/ss/usermodel/DateUtil.java
@@ -534,7 +534,7 @@ public class DateUtil {
return null;
}
int wholeDays = MathUtil.safeDoubleToInt(Math.floor(date));
- int millisecondsInDay = (int)((date - wholeDays) * DAY_MILLISECONDS +
0.5);
+ int millisecondsInDay = MathUtil.safeDoubleToInt((date - wholeDays) *
DAY_MILLISECONDS + 0.5);
Calendar calendar;
if (timeZone != null) {
calendar = LocaleUtil.getLocaleCalendar(timeZone);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]