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]

Reply via email to