johnfactotum / foliate

Read e-books in style
https://johnfactotum.github.io/foliate/
GNU General Public License v3.0
5.25k stars 254 forks source link

Segfault(often but not always) when copying text #1346

Open kxxt opened 5 days ago

kxxt commented 5 days ago

Describe the bug Sometimes when copying text using Ctrl+C or when pasting the copied text into other applications via mouse middle click crashes the application.

To Reproduce Steps to reproduce the behavior:

  1. Open an epub ebook. (I am using https://www.packtpub.com/en-us/product/linux-kernel-programming-9781803232225)
  2. Copy some text using Ctrl+C
  3. It often crashes

Expected behavior It doesn't crash.

Version:

Additional context

Stacktrace: (It's a null pointer dereference in gtk)

Core was generated by `/usr/bin/gjs-console -m /usr/bin/foliate'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  gdk_surface_request_motion (surface=0x0) at ../gtk/gdk/gdksurface.c:2954
2954      surface->request_motion = TRUE;
[Current thread is 1 (Thread 0x7f3d21bf5040 (LWP 10042))]
(gdb) bt
#0  gdk_surface_request_motion (surface=0x0) at ../gtk/gdk/gdksurface.c:2954
#1  0x00007f3d1966398a in gtk_window_native_layout (native=0x5aeeb8dd76e0, width=<optimized out>, height=<optimized out>) at ../gtk/gtk/gtkwindow.c:2162
#2  0x00007f3d195b64dd in gtk_native_layout (height=1044, width=1920, self=0x5aeeb8dd76e0) at ../gtk/gtk/gtknative.c:111
#3  surface_layout_cb (surface=<optimized out>, width=1920, height=1044, native=0x5aeeb8dd76e0) at ../gtk/gtk/gtknative.c:120
#4  0x00007f3d1948539e in _gtk_marshal_VOID__ENUM_INTv (closure=<optimized out>, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>,
n_params=<optimized out>, param_types=0x5aeeb8b56080) at gtk/gtkmarshalers.c:3419
#5  0x00007f3d24a3b732 in _g_closure_invoke_va (closure=0x5aeeb9172440, return_value=0x0, instance=0x5aeeb94df4a0, args=0x7ffe984136e0, n_params=<optimized out>, param_types=0x5aeeb8b56080)
at ../glib/gobject/gclosure.c:897
#6  signal_emit_valist_unlocked (instance=instance@entry=0x5aeeb94df4a0, signal_id=signal_id@entry=83, detail=detail@entry=0, var_args=var_args@entry=0x7ffe984136e0) at ../glib/gobject/gsignal.c:3424
#7  0x00007f3d24a3b842 in g_signal_emit_valist (instance=0x5aeeb94df4a0, signal_id=83, detail=0, var_args=var_args@entry=0x7ffe984136e0) at ../glib/gobject/gsignal.c:3263
#8  0x00007f3d24a3b904 in g_signal_emit (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../glib/gobject/gsignal.c:3583
#9  0x00007f3d24a3b732 in _g_closure_invoke_va (closure=0x5aeeb916b640, return_value=0x0, instance=0x5aeeb916b500, args=0x7ffe984139f0, n_params=<optimized out>, param_types=0x0)
at ../glib/gobject/gclosure.c:897
#10 signal_emit_valist_unlocked (instance=instance@entry=0x5aeeb916b500, signal_id=signal_id@entry=92, detail=detail@entry=0, var_args=var_args@entry=0x7ffe984139f0) at ../glib/gobject/gsignal.c:3424
#11 0x00007f3d24a3b842 in g_signal_emit_valist (instance=0x5aeeb916b500, signal_id=92, detail=0, var_args=var_args@entry=0x7ffe984139f0) at ../glib/gobject/gsignal.c:3263
#12 0x00007f3d24a3b904 in g_signal_emit (instance=instance@entry=0x5aeeb916b500, signal_id=<optimized out>, detail=detail@entry=0) at ../glib/gobject/gsignal.c:3583
#13 0x00007f3d19833414 in _gdk_frame_clock_emit_layout (frame_clock=0x5aeeb916b500) at ../gtk/gdk/gdkframeclock.c:724
#14 gdk_frame_clock_paint_idle (data=data@entry=0x5aeeb916b500) at ../gtk/gdk/gdkframeclockidle.c:610
#15 0x00007f3d198338bf in gdk_frame_clock_flush_idle (data=0x5aeeb916b500) at ../gtk/gdk/gdkframeclockidle.c:400
#16 0x00007f3d24ac5eda in g_timeout_dispatch (source=0x5aeeb8f46a10, callback=<optimized out>, user_data=<optimized out>) at ../glib/glib/gmain.c:4989
#17 0x00007f3d24ac4a89 in g_main_dispatch (context=0x5aeeb867d870) at ../glib/glib/gmain.c:3344
#18 0x00007f3d24b269b7 in g_main_context_dispatch_unlocked (context=0x5aeeb867d870) at ../glib/glib/gmain.c:4152
#19 g_main_context_iterate_unlocked.isra.0 (context=context@entry=0x5aeeb867d870, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4217
#20 0x00007f3d24ac3f95 in g_main_context_iteration (context=context@entry=0x5aeeb867d870, may_block=may_block@entry=1) at ../glib/glib/gmain.c:4282
#21 0x00007f3d24919b86 in g_application_run (application=0x5aeeb8cf8bb0, argc=<optimized out>, argv=0x5aeeb8cf7750) at ../glib/gio/gapplication.c:2712
#22 0x00007f3d247e5596 in ffi_call_unix64 () at ../src/x86/unix64.S:104
#23 0x00007f3d247e200e in ffi_call_int (cif=cif@entry=0x5aeeb8d0c560, fn=<optimized out>, rvalue=<optimized out>, avalue=<optimized out>, closure=closure@entry=0x0) at ../src/x86/ffi64.c:673
#24 0x00007f3d247e4bd3 in ffi_call (cif=0x5aeeb8d0c560, fn=<optimized out>, rvalue=<optimized out>, avalue=<optimized out>) at ../src/x86/ffi64.c:710
#25 0x00007f3d24c01fe1 in Gjs::Function::invoke (this=0x5aeeb8d0c540, context=0x5aeeb864d010, args=..., this_obj=..., r_value=0x0) at ../gjs/gi/function.cpp:1056
#26 0x00007f3d24c02688 in Gjs::Function::call (context=0x5aeeb864d010, js_argc=<optimized out>, vp=<optimized out>) at ../gjs/gi/function.cpp:1238
#27 0x00007f3d23915f7a in CallJSNative (cx=0x5aeeb864d010, native=0x7f3d24c025a0 <Gjs::Function::call(JSContext*, unsigned int, JS::Value*)>, reason=js::CallReason::Call, args=...)
at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:486
#28 js::InternalCallOrConstruct (cx=0x5aeeb864d010, args=..., construct=<optimized out>, reason=js::CallReason::Call) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:566
#29 0x00007f3d23a9aa51 in InternalCall (cx=0x5aeeb864d010, args=..., reason=js::CallReason::Call) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:647
#30 js::Call (cx=0x5aeeb864d010, thisv=..., args=..., reason=js::CallReason::Call, fval=..., rval=...) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:679
#31 js::SpreadCallOperation (cx=<optimized out>, script=..., pc=<optimized out>, thisv=..., callee=..., arr=..., newTarget=..., res=...) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:5206
#32 0x00007f3d235e19f8 in js::Interpret (cx=<optimized out>, state=...) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:3323
#33 0x00007f3d235d4bd5 in MaybeEnterInterpreterTrampoline (cx=0x5aeeb864d010, state=...) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:400
#34 js::RunScript (cx=0x5aeeb864d010, state=...) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:458
#35 js::InternalCallOrConstruct (cx=0x5aeeb864d010, args=..., construct=js::NO_CONSTRUCT, reason=<optimized out>) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:612
#36 InternalCall (cx=0x5aeeb864d010, args=..., reason=<optimized out>) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:647
#37 js::Call (cx=0x5aeeb864d010, fval=..., thisv=..., args=..., rval=..., reason=<optimized out>) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/Interpreter.cpp:679
#38 0x00007f3d23ab3b81 in JS::Call (cx=0x5aeeb864d010, thisv=..., fval=..., args=..., rval=...) at /usr/src/debug/js115/firefox-115.12.0/js/src/vm/CallAndConstruct.cpp:117
#39 0x00007f3d24c38f02 in JS::Call (rval=..., args=..., funObj=..., thisv=..., cx=<optimized out>) at /usr/include/mozjs-115/js/RootingAPI.h:1219
#40 GjsContextPrivate::run_main_loop_hook (this=0x5aeeb864ce10) at ../gjs/gjs/context.cpp:1491
#41 0x00007f3d24c4117f in GjsContextPrivate::eval_module (error=0x7ffe98414ce8, exit_status_p=0x7ffe98414cd8 "", identifier=0x5aeeb87a07a0 "file:///usr/bin/foliate", this=0x5aeeb864ce10)
at ../gjs/gjs/context.cpp:1608
#42 gjs_context_eval_module (js_context=<optimized out>, identifier=0x5aeeb87a07a0 "file:///usr/bin/foliate", exit_code=0x7ffe98414cd8 "", error=0x7ffe98414ce8) at ../gjs/gjs/context.cpp:1387
--Type <RET> for more, q to quit, c to continue without paging--
#43 0x00005aeea59bed87 in define_argv_and_eval_script (filename=0x5aeeb863eb40 "/usr/bin/foliate", len=<optimized out>,
script=0x5aeeb864f8a0 "#!/usr/bin/gjs-console -m\n// eslint-disable-next-line no-useless-escape\nconst MESON = '@GJS@' !== '/usr/bin/gjs-console' // the latter would be replace by Meson\n\nimport Gtk from 'gi://Gtk?version=4.0'"..., argv=<optimized out>, argc=<optimized out>, js_context=0x5aeeb864cfb0) at ../gjs/gjs/jsapi-util.h:163
#44 main (argc=<optimized out>, argv=<optimized out>) at ../gjs/gjs/console.cpp:393

This is probably not a bug in foliate itself but a bug in a dependency. I haven't got time to figure out which dependency to blame but a bug report here should be appropriate.

Inspired by the function name gdk_surface_request_motion in the backtrace, I tried to enable Reduce Animation in Behavior tab in settings as a temporary workaround. It appears to work. Well, it doesn't work. The crash still happens sometimes.

kxxt commented 4 days ago

This issue is reported to GTK here: https://gitlab.gnome.org/GNOME/gtk/-/issues/6817