summaryrefslogtreecommitdiff
path: root/basic
diff options
context:
space:
mode:
authorAndreas Heinisch <andreas.heinisch@yahoo.de>2024-04-10 21:40:47 +0200
committerAndreas Heinisch <andreas.heinisch@yahoo.de>2024-06-10 13:52:00 +0200
commit84e8758d429d5cfaa049cd0bf7777a437f539029 (patch)
treed1ef86e5ebcb890dcc4f5368bbd79d8a491b99bb /basic
parent18ef391582e1f8db5838dfc1aaff36f78ce51447 (diff)
tdf#160321 - Don't execute jump statement if the expression is out of range
Don't execute On expression GoSub Statement; On expression GoTo Statement if the expression lies out of range. Change-Id: I5c1de25918b5e812d7ec82034f8d56351374d56a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165960 Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de> Tested-by: Jenkins
Diffstat (limited to 'basic')
-rw-r--r--basic/qa/basic_coverage/test_tdf160321_gosub_goto.bas43
-rw-r--r--basic/qa/vba_tests/gosub_goto.vb44
-rw-r--r--basic/source/runtime/runtime.cxx15
3 files changed, 96 insertions, 6 deletions
diff --git a/basic/qa/basic_coverage/test_tdf160321_gosub_goto.bas b/basic/qa/basic_coverage/test_tdf160321_gosub_goto.bas
new file mode 100644
index 000000000000..79f886fa179d
--- /dev/null
+++ b/basic/qa/basic_coverage/test_tdf160321_gosub_goto.bas
@@ -0,0 +1,43 @@
+'
+' This file is part of the LibreOffice project.
+'
+' This Source Code Form is subject to the terms of the Mozilla Public
+' License, v. 2.0. If a copy of the MPL was not distributed with this
+' file, You can obtain one at http://mozilla.org/MPL/2.0/.
+'
+
+Option Explicit
+
+Function doUnitTest() As String
+ TestUtil.TestInit
+ verify_GoSub_GoTo
+ doUnitTest = TestUtil.GetResult()
+End Function
+
+Sub verify_GoSub_GoTo
+ On Error GoTo errorHandler
+
+ Dim iVar As Integer
+
+ ' tdf#160321 - don't execute the GoSub statement if the expression is 0
+ On 0 GoSub Sub1, Sub2
+ iVar = iVar + 1
+ TestUtil.AssertEqual(iVar, 1, "iVar incremented incorrectly")
+
+ ' tdf#160321 - check the correct functionality of the GoTo statement
+ On 1 GoTo Sub1, Sub2
+ iVar = iVar + 1
+
+ Exit Sub
+Sub1:
+ TestUtil.AssertEqual(iVar, 1, "iVar incremented incorrectly")
+ On 2 GoTo Sub1, Sub2
+ iVar = iVar + 1
+ Exit Sub
+Sub2:
+ TestUtil.AssertEqual(iVar, 1, "iVar incremented incorrectly")
+ Exit Sub
+errorHandler:
+ TestUtil.ReportErrorHandler("verify_GoSub_GoTo", Err, Error$, Erl)
+ Exit Sub
+End Sub
diff --git a/basic/qa/vba_tests/gosub_goto.vb b/basic/qa/vba_tests/gosub_goto.vb
new file mode 100644
index 000000000000..523f15ac94c9
--- /dev/null
+++ b/basic/qa/vba_tests/gosub_goto.vb
@@ -0,0 +1,44 @@
+'
+' This file is part of the LibreOffice project.
+'
+' This Source Code Form is subject to the terms of the Mozilla Public
+' License, v. 2.0. If a copy of the MPL was not distributed with this
+' file, You can obtain one at http://mozilla.org/MPL/2.0/.
+'
+
+Option VBASupport 1
+Option Explicit
+
+Function doUnitTest() As String
+ TestUtil.TestInit
+ verify_GoSub_GoTo
+ doUnitTest = TestUtil.GetResult()
+End Function
+
+Sub verify_GoSub_GoTo
+ On Error GoTo errorHandler
+
+ Dim iVar As Integer
+
+ ' tdf#160321 - don't execute the GoSub statement if the expression is 0
+ On 0 GoSub Sub1, Sub2
+ iVar = iVar + 1
+ TestUtil.AssertEqual(iVar, 1, "iVar incremented incorrectly")
+
+ ' tdf#160321 - check the correct functionality of the GoTo statement
+ On 1 GoTo Sub1, Sub2
+ iVar = iVar + 1
+
+ Exit Sub
+Sub1:
+ TestUtil.AssertEqual(iVar, 1, "iVar incremented incorrectly")
+ On 2 GoTo Sub1, Sub2
+ iVar = iVar + 1
+ Exit Sub
+Sub2:
+ TestUtil.AssertEqual(iVar, 1, "iVar incremented incorrectly")
+ Exit Sub
+errorHandler:
+ TestUtil.ReportErrorHandler("verify_GoSub_GoTo", Err, Error$, Erl)
+ Exit Sub
+End Sub
diff --git a/basic/source/runtime/runtime.cxx b/basic/source/runtime/runtime.cxx
index e2f82d5ad97d..90b40cb8adc8 100644
--- a/basic/source/runtime/runtime.cxx
+++ b/basic/source/runtime/runtime.cxx
@@ -3043,13 +3043,16 @@ void SbiRuntime::StepONJUMP( sal_uInt32 nOp1 )
{
SbxVariableRef p = PopVar();
sal_Int16 n = p->GetInteger();
- if( nOp1 & 0x8000 )
- {
+
+ if (nOp1 & 0x8000)
nOp1 &= 0x7FFF;
- PushGosub( pCode + 5 * nOp1 );
- }
- if( n < 1 || o3tl::make_unsigned(n) > nOp1 )
- n = static_cast<sal_Int16>( nOp1 + 1 );
+
+ // tdf#160321 - do not execute the jump statement if the expression is out of range
+ if (n < 1 || o3tl::make_unsigned(n) > nOp1)
+ n = static_cast<sal_Int16>(nOp1 + 1);
+ else if (nOp1 & 0x8000)
+ PushGosub(pCode + 5 * nOp1);
+
nOp1 = static_cast<sal_uInt32>(pCode - pImg->GetCode()) + 5 * --n;
StepJUMP( nOp1 );
}