From 520e94f2d7f2e7d12b3ec408cdb7352e9d21452a Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Fri, 8 Apr 2022 17:01:55 +0000 Subject: [PATCH] fpspreadsheet: Fix integer overflow in formulas with large integer values. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8246 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../source/common/fpsexprparser.pas | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/components/fpspreadsheet/source/common/fpsexprparser.pas b/components/fpspreadsheet/source/common/fpsexprparser.pas index d7e523076..d0ea7fa22 100644 --- a/components/fpspreadsheet/source/common/fpsexprparser.pas +++ b/components/fpspreadsheet/source/common/fpsexprparser.pas @@ -3181,7 +3181,10 @@ begin else if cell^.ContentType = cctNumber then begin - if frac(cell^.NumberValue) = 0.0 then + if (frac(cell^.NumberValue) = 0.0) and + (cell^.Numbervalue >= -Integer(MaxInt)-1) and + (cell^.NumberValue <= MaxInt) + then Result := IntegerResult(trunc(cell^.NumberValue)) else Result := FloatResult(cell^.NumberValue); @@ -3240,11 +3243,14 @@ begin Result := ErrorResult(errWrongType); end else if (cell^.ContentType = cctNumber) or (cell^.ContentType = cctDateTime) then - begin - if frac(cell^.NumberValue) = 0.0 then + begin + if (frac(cell^.NumberValue) = 0.0) and + (cell^.NumberValue >= -Integer(MaxInt)-1) and + (cell^.NumberValue <= MaxInt) + then Result := IntegerResult(-trunc(cell^.NumberValue)) - else - Result := FloatResult(cell^.NumberValue); + else + Result := FloatResult(-cell^.NumberValue); end else if (cell^.ContentType = cctBool) then Result := ErrorResult(errWrongType);