From 983fbff8711a8c625e494a981891a90d47847e14 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 2 Jan 2022 21:46:14 +0100 Subject: [PATCH] * proper range checking for TryStrToDWord, should resolve all issues in #39406 --- rtl/objpas/sysutils/sysstr.inc | 10 +++++++--- tests/webtbs/tw39406.pp | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 tests/webtbs/tw39406.pp diff --git a/rtl/objpas/sysutils/sysstr.inc b/rtl/objpas/sysutils/sysstr.inc index 7ed0396587..b4ee1814db 100644 --- a/rtl/objpas/sysutils/sysstr.inc +++ b/rtl/objpas/sysutils/sysstr.inc @@ -1007,10 +1007,14 @@ begin end; function TryStrToDWord(const s: string; Out D: DWord): boolean; -var Error : word; +var + Error : word; + lq : QWord; begin - Val(s, D, Error); - TryStrToDWord:=Error=0 + Val(s, lq, Error); + TryStrToDWord:=(Error=0) and (lq<=High(DWord)); + if TryStrToDWord then + D:=lq; end; function StrToUInt(const s: string): Cardinal; diff --git a/tests/webtbs/tw39406.pp b/tests/webtbs/tw39406.pp new file mode 100644 index 0000000000..7d6e67c6eb --- /dev/null +++ b/tests/webtbs/tw39406.pp @@ -0,0 +1,14 @@ +{$mode objfpc} +program fpbug; + +uses + SysUtils; + +var + Value: Cardinal; + Success: Boolean; +begin + Success := TryStrToDword('7795000000', Value); + if Success then + halt(1); +end.