Mercurial > octave
comparison 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 |
comparison
equal
deleted
inserted
replaced
30193:6cc5315cdf2f | 30199:37ddca7ad9cb |
---|---|
198 static std::size_t get_num_symbols (octave_user_script *script); | 198 static std::size_t get_num_symbols (octave_user_script *script); |
199 | 199 |
200 void set_script_offsets (void); | 200 void set_script_offsets (void); |
201 | 201 |
202 void set_script_offsets_internal (const std::map<std::string, | 202 void set_script_offsets_internal (const std::map<std::string, |
203 symbol_record>& symbols); | 203 symbol_record>& symbols); |
204 | 204 |
205 void resize_and_update_script_offsets (const symbol_record& sym); | 205 void resize_and_update_script_offsets (const symbol_record& sym); |
206 | 206 |
207 symbol_scope get_scope (void) const { return m_script->scope (); } | 207 symbol_scope get_scope (void) const { return m_script->scope (); } |
208 | 208 |
1863 // duplication? | 1863 // duplication? |
1864 | 1864 |
1865 std::map<std::string, symbol_record> tmp_symbols; | 1865 std::map<std::string, symbol_record> tmp_symbols; |
1866 tmp_symbols[sym.name ()] = sym; | 1866 tmp_symbols[sym.name ()] = sym; |
1867 set_script_offsets_internal (tmp_symbols); | 1867 set_script_offsets_internal (tmp_symbols); |
1868 | |
1869 // set_script_offsets_internal may have modified | |
1870 // m_lexical_frame_offsets and m_value_offsets. | |
1871 | |
1872 frame_offset = m_lexical_frame_offsets.at (data_offset); | |
1868 } | 1873 } |
1869 | 1874 |
1870 data_offset = m_value_offsets.at (data_offset); | 1875 data_offset = m_value_offsets.at (data_offset); |
1871 } | 1876 } |
1872 else | 1877 else |