diff options
author | Andreas Heinisch <andreas.heinisch@yahoo.de> | 2024-04-10 21:40:47 +0200 |
---|---|---|
committer | Andreas Heinisch <andreas.heinisch@yahoo.de> | 2024-06-10 13:52:00 +0200 |
commit | 84e8758d429d5cfaa049cd0bf7777a437f539029 (patch) | |
tree | d1ef86e5ebcb890dcc4f5368bbd79d8a491b99bb /basic | |
parent | 18ef391582e1f8db5838dfc1aaff36f78ce51447 (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.bas | 43 | ||||
-rw-r--r-- | basic/qa/vba_tests/gosub_goto.vb | 44 | ||||
-rw-r--r-- | basic/source/runtime/runtime.cxx | 15 |
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 ); } |