Mercurial > octave-libtiff
changeset 30199:37ddca7ad9cb stable
avoid internal error and segfault with eval and scripts (bug #61191)
* stack-frame.cc (script_stack_frame::get_val_offsets_with_insert):
If frame_offset is initially zero then update frame_offset from
m_lexical_frame_offsets after calling set_script_offsets_internal.
* test/bug-61191/bug-61191.tst, test/bug-61191/subdir/bug_61191.m:
New files.
* test/bug-61191/module.mk: Update.
* test/module.mk: Update.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 21 Sep 2021 13:14:31 -0400 |
parents | 6cc5315cdf2f |
children | 3e419a830e90 3b6e0f476381 |
files | libinterp/corefcn/stack-frame.cc test/bug-61191/bug-61191.tst test/bug-61191/module.mk test/bug-61191/subdir/bug_61191.m test/module.mk |
diffstat | 5 files changed, 52 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/stack-frame.cc Tue Sep 14 13:27:48 2021 -0400 +++ b/libinterp/corefcn/stack-frame.cc Tue Sep 21 13:14:31 2021 -0400 @@ -200,7 +200,7 @@ void set_script_offsets (void); void set_script_offsets_internal (const std::map<std::string, - symbol_record>& symbols); + symbol_record>& symbols); void resize_and_update_script_offsets (const symbol_record& sym); @@ -1865,6 +1865,11 @@ std::map<std::string, symbol_record> tmp_symbols; tmp_symbols[sym.name ()] = sym; set_script_offsets_internal (tmp_symbols); + + // set_script_offsets_internal may have modified + // m_lexical_frame_offsets and m_value_offsets. + + frame_offset = m_lexical_frame_offsets.at (data_offset); } data_offset = m_value_offsets.at (data_offset);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/bug-61191/bug-61191.tst Tue Sep 21 13:14:31 2021 -0400 @@ -0,0 +1,36 @@ +######################################################################## +## +## Copyright (C) 2021 The Octave Project Developers +## +## See the file COPYRIGHT.md in the top-level directory of this +## distribution or <https://octave.org/copyright/>. +## +## This file is part of Octave. +## +## Octave is free software: you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## <https://www.gnu.org/licenses/>. +## +######################################################################## + +%!test <61191> +%! unwind_protect +%! addpath ("subdir"); +%! omc_1 = rand (3, 1); +%! Tc_1 = rand (3, 1); +%! bug_61191 +%! assert (omckk, omc_1); +%! assert (Tckk, Tc_1); +%! unwind_protect_cleanup +%! rmpath ("subdir"); +%! end_unwind_protect
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/bug-61191/module.mk Tue Sep 21 13:14:31 2021 -0400 @@ -0,0 +1,5 @@ +bug_61191_TEST_FILES = \ + %reldir%/bug-61191.tst \ + %reldir%/subdir/bug_61191.m + +TEST_FILES += $(bug_61191_TEST_FILES)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/bug-61191/subdir/bug_61191.m Tue Sep 21 13:14:31 2021 -0400 @@ -0,0 +1,4 @@ +kk = 1; +eval (['omckk = omc_' num2str(kk) ';']); +eval (['Tckk = Tc_' num2str(kk) ';']); +eval (['omc_' num2str(kk) ' = omckk;']);
--- a/test/module.mk Tue Sep 14 13:27:48 2021 -0400 +++ b/test/module.mk Tue Sep 21 13:14:31 2021 -0400 @@ -92,6 +92,7 @@ include %reldir%/bug-59937/module.mk include %reldir%/bug-60237/module.mk include %reldir%/bug-61105/module.mk +include %reldir%/bug-61191/module.mk include %reldir%/class-concat/module.mk include %reldir%/classdef/module.mk include %reldir%/classdef-multiple-inheritance/module.mk