From b92215149880d80164fc911fe41ef212f8ea134c Mon Sep 17 00:00:00 2001 From: swmal <897655+swmal@users.noreply.github.com> Date: Wed, 18 Feb 2026 09:29:14 +0100 Subject: [PATCH] Fix off-by-one in InsertAndShift resize condition (#2291) --- src/EPPlus/Core/ChangableDictionary.cs | 2 +- src/EPPlusTest/Issues/WorksheetIssues.cs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/EPPlus/Core/ChangableDictionary.cs b/src/EPPlus/Core/ChangableDictionary.cs index 7668b18cc..260f7a484 100644 --- a/src/EPPlus/Core/ChangableDictionary.cs +++ b/src/EPPlus/Core/ChangableDictionary.cs @@ -66,7 +66,7 @@ internal virtual void InsertAndShift(int fromPosition, int add) pos = ~pos; } - if (pos + 1 >= _index[0].Length - 1) + if (_count >= _index[0].Length - 1) { Array.Resize(ref _index[0], _index[0].Length << 1); Array.Resize(ref _index[1], _index[1].Length << 1); diff --git a/src/EPPlusTest/Issues/WorksheetIssues.cs b/src/EPPlusTest/Issues/WorksheetIssues.cs index a7cd11ea6..13aaf0530 100644 --- a/src/EPPlusTest/Issues/WorksheetIssues.cs +++ b/src/EPPlusTest/Issues/WorksheetIssues.cs @@ -4,6 +4,7 @@ using OfficeOpenXml.Drawing; using OfficeOpenXml.Drawing.Chart; using OfficeOpenXml.FormulaParsing; +using OfficeOpenXml.FormulaParsing.Excel.Functions.Information; using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical; using OfficeOpenXml.FormulaParsing.Excel.Functions.MathFunctions; using OfficeOpenXml.RichData; @@ -1112,5 +1113,22 @@ public void i2258() Assert.AreEqual("Negative 4000,000", d3); } + [TestMethod] + public void InsertAndShift_ShouldNotThrow_WhenArrayIsFull() + { + using var package = new ExcelPackage(); + var sheet = package.Workbook.Worksheets.Add("Sheet1"); + + // Fill 7 columns with formatting to trigger the boundary condition + for (int col = 1; col <= 7; col++) + { + sheet.Column(col).Width = 15; + } + + // These two inserts should not throw ArgumentException + sheet.InsertColumn(3, 1); + sheet.InsertColumn(5, 1); + } + } }