bugGNU Octave - Bugs: bug #59937, eval("global b") in...

 
 

bug #59937: eval("global b") in m-file segfaults

Submitter:  Dmitri A. Sergatskov <dasergatskov>
Submitted:  Sun 24 Jan 2021 11:20:00 PM UTC
   
 
Category:  Interpreter Severity:  3 - Normal
Priority:  5 - Normal Item Group:  Segfault, Bus Error, etc.
Status:  Fixed Assigned to:  None
Originator Name:  Open/Closed:  * Closed
Release:  * 6.1.0 Operating System:  * GNU/Linux
Fixed Release:  None Planned Release:  None
* Mandatory Fields

Add a New Comment Rich Markup
   

Mon 25 Jan 2021 10:35:51 PM UTC, comment #5: 

Tested on stable and works fine.  Marking as fixed and closing report.

Rik <rik5>
Group administrator
Mon 25 Jan 2021 08:18:41 PM UTC, comment #4: 

Thanks.  I created a test and pushed it on stable then merged with default.

http://hg.savannah.gnu.org/hgweb/octave/rev/1a20cb5be8da

John W. Eaton <jwe>
Group administrator
Mon 25 Jan 2021 07:29:56 PM UTC, comment #3: 

The patch works for me.  I also tested it with evalin() and it worked there too.

Rik <rik5>
Group administrator
Mon 25 Jan 2021 07:15:22 PM UTC, comment #2: 

The attached patch avoids the problem for me.  I'll commit if someone confirms and also after I have a test to add to the test suite.


(file #50785)

John W. Eaton <jwe>
Group administrator
Sun 24 Jan 2021 11:53:34 PM UTC, comment #1: 

Confirmed.  It is also present on the development branch.

Here is a backtrace from the development branch


#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007f118bd71921 in __GI_abort () at abort.c:79
#2  0x00007f118c3c6957 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007f118c3ccae6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007f118c3ccb21 in std::terminate() ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007f118c3ccd54 in __cxa_throw ()
   from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x00007f118c3c885d in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#7  0x00007f118e6d64a0 in std::vector<unsigned long, std::allocator<unsigned long> >::_M_range_check (this=0x7f11584e16a0, __n=2)
    at /usr/include/c++/7/bits/stl_vector.h:825
#8  0x00007f118e6d4821 in std::vector<unsigned long, std::allocator<unsigned long> >::at (this=0x7f11584e16a0, __n=2)
    at /usr/include/c++/7/bits/stl_vector.h:846
#9  0x00007f118e6cd771 in octave::script_stack_frame::mark_scope (
    this=0x7f11584e1620, sym=..., flag=octave::stack_frame::GLOBAL)
    at libinterp/corefcn/stack-frame.cc:1998
#10 0x00007f118e6d05fc in octave::compiled_fcn_stack_frame::mark_scope (
    this=0x7f11581e7020, sym=..., flag=octave::stack_frame::GLOBAL)
    at libinterp/corefcn/stack-frame.cc:138
#11 0x00007f118e2310aa in octave::stack_frame::mark_global (
    this=0x7f11581e7020, sym=...) at libinterp/corefcn/stack-frame.h:323
#12 0x00007f118e6cadfe in octave::stack_frame::install_variable (
    this=0x7f11581e7020, sym=..., value=..., global=true)
#13 0x00007f118e230fab in octave::stack_frame::make_global (this=0x7f11581e7020, sym=...)
    at libinterp/corefcn/stack-frame.h:303
#14 0x00007f118e22e38f in octave::call_stack::make_global (this=0x7f1158005960, sym=...)
    at libinterp/corefcn/call-stack.cc:877
#15 0x00007f118e16e745 in octave::tree_evaluator::visit_decl_elt (this=0x7f1158005838, elt=...)
    at libinterp/parse-tree/pt-eval.cc:2812
#16 0x00007f118e1a04d6 in octave::tree_decl_elt::accept (this=0x7f1158344390, tw=...)
    at libinterp/parse-tree/pt-decl.h:98
#17 0x00007f118e1b4de9 in octave::tree_walker::visit_decl_init_list (this=0x7f1158005838, lst=...)
    at libinterp/parse-tree/pt-walk.cc:132
#18 0x00007f118e17b2c8 in octave::tree_decl_init_list::accept (this=0x7f1158415f00, tw=...)
    at libinterp/parse-tree/pt-decl.h:165
#19 0x00007f118e16e6a8 in octave::tree_evaluator::visit_decl_command (this=0x7f1158005838, cmd=...)
    at libinterp/parse-tree/pt-eval.cc:2801
#20 0x00007f118e164568 in octave::tree_decl_command::accept (this=0x7f115840efb0, tw=...)
    at libinterp/parse-tree/pt-decl.h:207
#21 0x00007f118e1715dd in octave::tree_evaluator::visit_statement (this=0x7f1158005838, stmt=...)
    at libinterp/parse-tree/pt-eval.cc:3559
#22 0x00007f118e1a28b4 in octave::tree_statement::accept (this=0x7f11581fe700, tw=...)
    at libinterp/parse-tree/pt-stmt.h:124
#23 0x00007f118e171bcd in octave::tree_evaluator::visit_statement_list (this=0x7f1158005838, lst=...)
    at libinterp/parse-tree/pt-eval.cc:3667
#24 0x00007f118df099de in octave::tree_statement_list::accept (this=0x7f11585163c0, tw=...)
    at libinterp/parse-tree/pt-stmt.h:201
#25 0x00007f118e1670e3 in octave::tree_evaluator::eval_string (this=0x7f1158005838,
    eval_str="global b", silent=false, parse_status=@0x7f115fff66e4: 0, nargout=0)
    at libinterp/parse-tree/pt-eval.cc:946
#26 0x00007f118e167445 in octave::tree_evaluator::eval (this=0x7f1158005838, try_code="global b",
    nargout=0) at libinterp/parse-tree/pt-eval.cc:989
#27 0x00007f118e54c9f8 in octave::interpreter::eval (this=0x7f1158004a60, try_code="global b",
    nargout=0) at libinterp/corefcn/interpreter.cc:1382
#28 0x00007f118e13cfe2 in Feval (interp=..., args=..., nargout=0)
    at libinterp/parse-tree/oct-parse.yy:5633
#29 0x00007f118df5e868 in octave_builtin::execute (this=0x7f1158024fb0, tw=..., nargout=0, args=...)
    at libinterp/octave-value/ov-builtin.cc:65
#30 0x00007f118dfc6074 in octave_function::call (this=0x7f1158024fb0, tw=..., nargout=0, args=...)
    at libinterp/octave-value/ov-fcn.cc:57
#31 0x00007f118e19472b in octave::tree_index_expression::evaluate_n (this=0x7f115851b400, tw=...,
    nargout=0) at libinterp/parse-tree/pt-idx.cc:402
#32 0x00007f118e197356 in octave::tree_index_expression::evaluate (this=0x7f115851b400, tw=...,
    nargout=0) at libinterp/parse-tree/pt-idx.h:107
#33 0x00007f118e1716c8 in octave::tree_evaluator::visit_statement (this=0x7f1158005838, stmt=...)
    at libinterp/parse-tree/pt-eval.cc:3582
#34 0x00007f118e1a28b4 in octave::tree_statement::accept (this=0x7f115840ef70, tw=...)
    at libinterp/parse-tree/pt-stmt.h:124
#35 0x00007f118e171bcd in octave::tree_evaluator::visit_statement_list (this=0x7f1158005838, lst=...)
    at libinterp/parse-tree/pt-eval.cc:3667
#36 0x00007f118df099de in octave::tree_statement_list::accept (this=0x7f115821f4b0, tw=...)
    at libinterp/parse-tree/pt-stmt.h:201
#37 0x00007f118e16fe46 in octave::tree_evaluator::execute_user_script (this=0x7f1158005838,
    user_script=..., nargout=0, args=...) at libinterp/parse-tree/pt-eval.cc:3172
#38 0x00007f118e08c970 in octave_user_script::execute (this=0x7f11581f5960, tw=..., nargout=0,
    args=...) at libinterp/octave-value/ov-usr-fcn.cc:196
#39 0x00007f118e08c8de in octave_user_script::call (this=0x7f11581f5960, tw=..., nargout=0, args=...)
    at libinterp/octave-value/ov-usr-fcn.cc:189
#40 0x00007f118e191f9a in octave::tree_identifier::evaluate_n (this=0x7f1158003260, tw=...,
    nargout=0) at libinterp/parse-tree/pt-id.cc:130
#41 0x00007f118e192786 in octave::tree_identifier::evaluate (this=0x7f1158003260, tw=..., nargout=0)
    at libinterp/parse-tree/pt-id.h:98
#42 0x00007f118e1716c8 in octave::tree_evaluator::visit_statement (this=0x7f1158005838, stmt=...)
    at libinterp/parse-tree/pt-eval.cc:3582
#43 0x00007f118e1a28b4 in octave::tree_statement::accept (this=0x7f11580032a0, tw=...)
    at libinterp/parse-tree/pt-stmt.h:124
#44 0x00007f118e171bcd in octave::tree_evaluator::visit_statement_list (this=0x7f1158005838, lst=...)
    at libinterp/parse-tree/pt-eval.cc:3667
#45 0x00007f118df099de in octave::tree_statement_list::accept (this=0x7f115848f930, tw=...)
    at libinterp/parse-tree/pt-stmt.h:201
#46 0x00007f118e166c52 in octave::tree_evaluator::eval (this=0x7f1158005838,
    stmt_list=std::shared_ptr<octave::tree_statement_list> (use count 2, weak count 0) = {...},
    interactive=true) at libinterp/parse-tree/pt-eval.cc:862
#47 0x00007f118e166332 in octave::tree_evaluator::repl (this=0x7f1158005838)
    at libinterp/parse-tree/pt-eval.cc:703
#48 0x00007f118e54c000 in octave::interpreter::main_loop (this=0x7f1158004a60)
    at libinterp/corefcn/interpreter.cc:1220
#49 0x00007f118e547082 in octave::interpreter::execute (this=0x7f1158004a60)
    at libinterp/corefcn/interpreter.cc:814
#50 0x00007f118eedf9a9 in octave::interpreter_qobject::execute (this=0x559dcbe7ea50)
    at libgui/src/interpreter-qobject.cc:90
#51 0x00007f118f0052ab in octave::interpreter_qobject::qt_static_metacall (_o=0x559dcbe7ea50,
    _c=QMetaObject::InvokeMetaMethod, _id=3, _a=0x559dcbef8250)
    at libgui/src/moc-interpreter-qobject.cc:95
#52 0x00007f11899cf0c2 in QObject::event(QEvent*) () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#53 0x00007f118a71d83c in QApplicationPrivate::notify_helper(QObject*, QEvent*) ()
#54 0x00007f118a725104 in QApplication::notify(QObject*, QEvent*) ()
   from /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#55 0x00007f118ef54dfe in octave::octave_qapplication::notify (this=0x559dcbddd1a0,
    receiver=0x559dcbe7ea50, ev=0x559dcbe88700) at libgui/src/octave-qobject.cc:132
#56 0x00007f118999f8d8 in QCoreApplication::notifyInternal2(QObject*, QEvent*) ()
   from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#57 0x00007f11899a204d in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) ()
   from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#58 0x00007f11899f9263 in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#59 0x00007f1181fc2417 in g_main_context_dispatch () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#60 0x00007f1181fc2650 in ?? () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#61 0x00007f1181fc26dc in g_main_context_iteration () from /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0
#62 0x00007f11899f888f in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
    () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#63 0x00007f118999d90a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) ()
   from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#64 0x00007f11897bc23a in QThread::exec() () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#65 0x00007f11897c117d in ?? () from /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#66 0x00007f1188f5c6db in start_thread (arg=0x7f115ffff700) at pthread_create.c:463
#67 0x00007f118be5271f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95


I included everything, but the proximate cause is line 1998 in stack_frame.cc:


    size_t frame_offset = m_lexical_frame_offsets.at (data_offset);


Since we are indexing, my guess is that data_offset is somehow just out of range.

Rik <rik5>
Group administrator
Sun 24 Jan 2021 11:20:00 PM UTC, original submission:  

running the test script t1.m with a single line:



eval("global b")


crashes octave 6.1.1:

octave:1> t1
terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 2) >= this->size() (which is 2)
fatal: caught signal Aborted -- stopping myself...
Aborted (core dumped)

Backtrace:


octave:1> t1
terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check: __n (which is 2) >= this->size() (which is 2)

Thread 7 "QThread" received signal SIGABRT, Aborted.
[Switching to Thread 0x7fffbd5a4700 (LWP 315600)]
0x00007fffe8c6a7ff in raise () from /lib64/libc.so.6
Missing separate debuginfos,
 <...deleted...>

(gdb) thread apply all bt

Thread 8 (Thread 0x7fffbc9b7700 (LWP 315601)):
#0  0x00007fffe8c6b5cc in sigtimedwait () at /lib64/libc.so.6
#1  0x00007fffe90086ac in sigwait () at /lib64/libpthread.so.0
#2  0x00007ffff6e75d60 in __interceptor_sigwait.part.123 () at /lib64/libasan.so.5
#3  0x00007ffff158ae18 in signal_watcher (arg=0x7ffff578242c <octave::generic_sig_handler(int)>) at ../liboctave/wrappers/signal-wrappers.c:697
#4  0x00007fffe8ffe14a in start_thread () at /lib64/libpthread.so.0
#5  0x00007fffe8d2ff23 in clone () at /lib64/libc.so.6

Thread 7 (Thread 0x7fffbd5a4700 (LWP 315600)):
#0  0x00007fffe8c6a7ff in raise () at /lib64/libc.so.6
#1  0x00007fffe8c54c35 in abort () at /lib64/libc.so.6
#2  0x00007fffe9a7809b in __gnu_cxx::__verbose_terminate_handler() [clone .cold.1] () at /lib64/libstdc++.so.6
#3  0x00007fffe9a7e53c in __cxxabiv1::__terminate(void (*)()) () at /lib64/libstdc++.so.6
#4  0x00007fffe9a7e597 in  () at /lib64/libstdc++.so.6
#5  0x00007ffff1c3b70b in qt_assert(char const*, char const*, int) () at /lib64/libQt5Core.so.5
#6  0x00007ffff1c3d67c in QThreadPrivate::start(void*) [clone .cold.20] () at /lib64/libQt5Core.so.5
#7  0x00007fffe8ffe14a in start_thread () at /lib64/libpthread.so.0
#8  0x00007fffe8d2ff23 in clone () at /lib64/libc.so.6

Thread 6 (Thread 0x7fffbe0b0700 (LWP 315598)):
#0  0x00007fffe8d24ca1 in poll () at /lib64/libc.so.6
#1  0x00007ffff6e5f242 in poll () at /lib64/libasan.so.5
#2  0x00007fffe4f1b9b6 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#3  0x00007fffe4f1bae0 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#4  0x00007ffff1e6618b in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#5  0x00007ffff1e1218b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#6  0x00007ffff1c70d42 in QThread::exec() () at /lib64/libQt5Core.so.5
#7  0x00007fffd675cee9 in QDBusConnectionManager::run() () at /lib64/libQt5DBus.so.5
#8  0x00007ffff1c72076 in QThreadPrivate::start(void*) () at /lib64/libQt5Core.so.5
#9  0x00007fffe8ffe14a in start_thread () at /lib64/libpthread.so.0
#10 0x00007fffe8d2ff23 in clone () at /lib64/libc.so.6

Thread 5 (Thread 0x7fffbfda1700 (LWP 315597)):
#0  0x00007fffe8d24ca1 in poll () at /lib64/libc.so.6
#1  0x00007ffff6e5f242 in poll () at /lib64/libasan.so.5
#2  0x00007fffe4f1b9b6 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#3  0x00007fffe4f1bd72 in g_main_loop_run () at /lib64/libglib-2.0.so.0
#4  0x00007fffc37a355a in gdbus_shared_thread_func () at /lib64/libgio-2.0.so.0
#5  0x00007fffe4f43d4a in g_thread_proxy () at /lib64/libglib-2.0.so.0
#6  0x00007fffe8ffe14a in start_thread () at /lib64/libpthread.so.0
#7  0x00007fffe8d2ff23 in clone () at /lib64/libc.so.6

Thread 4 (Thread 0x7fffc05a2700 (LWP 315596)):
#0  0x00007fffe8d24ca1 in poll () at /lib64/libc.so.6
--Type <RET> for more, q to quit, c to continue without paging--
#1  0x00007ffff6e5f242 in poll () at /lib64/libasan.so.5
#2  0x00007fffe4f1b9b6 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#3  0x00007fffe4f1bae0 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#4  0x00007fffe4f1bb31 in glib_worker_main () at /lib64/libglib-2.0.so.0
#5  0x00007fffe4f43d4a in g_thread_proxy () at /lib64/libglib-2.0.so.0
#6  0x00007fffe8ffe14a in start_thread () at /lib64/libpthread.so.0
#7  0x00007fffe8d2ff23 in clone () at /lib64/libc.so.6

Thread 3 (Thread 0x7fffc0da3700 (LWP 315595)):
#0  0x00007fffe8d24ca1 in poll () at /lib64/libc.so.6
#1  0x00007ffff6e5f242 in poll () at /lib64/libasan.so.5
#2  0x00007fffe4f1b9b6 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#3  0x00007fffe4f1bae0 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#4  0x00007fffc0dace6d in dconf_gdbus_worker_thread () at /usr/lib64/gio/modules/libdconfsettings.so
#5  0x00007fffe4f43d4a in g_thread_proxy () at /lib64/libglib-2.0.so.0
#6  0x00007fffe8ffe14a in start_thread () at /lib64/libpthread.so.0
#7  0x00007fffe8d2ff23 in clone () at /lib64/libc.so.6

Thread 2 (Thread 0x7fffc62d1700 (LWP 315594)):
#0  0x00007fffe8d24ca1 in poll () at /lib64/libc.so.6
#1  0x00007ffff6e5f242 in poll () at /lib64/libasan.so.5
#2  0x00007fffe32a16cf in _xcb_conn_wait () at /lib64/libxcb.so.1
#3  0x00007fffe32a334a in xcb_wait_for_event () at /lib64/libxcb.so.1
#4  0x00007fffc86573d8 in QXcbEventQueue::run() () at /lib64/libQt5XcbQpa.so.5
#5  0x00007ffff1c72076 in QThreadPrivate::start(void*) () at /lib64/libQt5Core.so.5
#6  0x00007fffe8ffe14a in start_thread () at /lib64/libpthread.so.0
#7  0x00007fffe8d2ff23 in clone () at /lib64/libc.so.6

Thread 1 (Thread 0x7fffd8ffbcc0 (LWP 315569)):
#0  0x00007fffe8d24ca1 in poll () at /lib64/libc.so.6
#1  0x00007ffff6e5f242 in poll () at /lib64/libasan.so.5
#2  0x00007fffe4f1b9b6 in g_main_context_iterate.isra () at /lib64/libglib-2.0.so.0
#3  0x00007fffe4f1bae0 in g_main_context_iteration () at /lib64/libglib-2.0.so.0
#4  0x00007ffff1e6618b in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#5  0x00007ffff1e1218b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib64/libQt5Core.so.5
#6  0x00007ffff1e1a1a6 in QCoreApplication::exec() () at /lib64/libQt5Core.so.5
#7  0x00007ffff670cfe3 in octave::base_qobject::exec() (this=0x7fffffffc080) at ../libgui/src/octave-qobject.cc:284
#8  0x00007ffff672c3f7 in octave::qt_application::execute() (this=0x7fffffffc430) at ../libgui/src/qt-application.cc:73
#9  0x00000000004023b9 in main(int, char**) (argc=8, argv=0x7fffffffc768) at ../src/main-gui.cc:106
(gdb)


Dmitri.
--

Dmitri A. Sergatskov <dasergatskov>

 

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach Files:
   
   
Comment:
   

Attached Files

 

Depends on the following items: None found

Items that depend on this one: None found

 

Carbon-Copy List
  • -email is unavailable- added by jwe (Updated the item)
  • -email is unavailable- added by rik5 (Posted a comment)
  • -email is unavailable- added by dasergatskov (Submitted the item)
  •  

    There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.

    Only group members can vote.

     

    Follow 9 latest changes.

    Date Changed by Updated Field Previous Value => Replaced by
    2021-01-25 rik5 StatusReady For Test Fixed
        Open/ClosedOpen Closed
    2021-01-25 jwe StatusPatch Submitted Ready For Test
    2021-01-25 jwe StatusPatch Reviewed Patch Submitted
    2021-01-25 rik5 StatusPatch Submitted Patch Reviewed
    2021-01-25 jwe Attached File- Added eval-global-in-script-diffs.txt, #50785
        StatusConfirmed Patch Submitted
    2021-01-24 rik5 StatusNone Confirmed
        Summaryeval(&quot;global b&quot;) in m-file sigfaults eval("global b") in m-file segfaults

    Back to the top

    Powered by Savane 3.13-02a9.
    Corresponding source code