diff libinterp/corefcn/stack-frame.cc @ 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 d13d090cb03a
children 3e419a830e90
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);