# HG changeset patch # User John W. Eaton # Date 1632244471 14400 # Node ID 37ddca7ad9cb06ad018388bd50b3bb886e5984b5 # Parent 6cc5315cdf2f52e214b26a2d1612abc1eb4eeb12 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. diff -r 6cc5315cdf2f -r 37ddca7ad9cb libinterp/corefcn/stack-frame.cc --- 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& symbols); + symbol_record>& symbols); void resize_and_update_script_offsets (const symbol_record& sym); @@ -1865,6 +1865,11 @@ std::map 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); diff -r 6cc5315cdf2f -r 37ddca7ad9cb test/bug-61191/bug-61191.tst --- /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 . +## +## 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 +## . +## +######################################################################## + +%!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 diff -r 6cc5315cdf2f -r 37ddca7ad9cb test/bug-61191/module.mk --- /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) diff -r 6cc5315cdf2f -r 37ddca7ad9cb test/bug-61191/subdir/bug_61191.m --- /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;']); diff -r 6cc5315cdf2f -r 37ddca7ad9cb test/module.mk --- 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