Reproducible crashes on export

When exporting certain documents to PDF, Paperwork always segfaults with no warning, always while exporting one particular page too. There’s nothing suspicious seeming in the logs either, from export onwards it just reads

INFO  ] [openpaperwork_gtk.widgets.progress] Task 'export' has started (0 already active)
[WARNING] [openpaperwork_core.perfcheck.log] Task 'url_to_pillow(file:///home/uni/papers/20240124_2151_26/paper.1.png)' took 241ms (> 200ms) ! ({'size': (2552, 3508)})
[WARNING] [openpaperwork_core.perfcheck.log] Task 'url_to_pillow(file:///home/uni/papers/20240124_2151_26/paper.2.png)' took 206ms (> 200ms) ! ({'size': (2552, 3508)})
[WARNING] [openpaperwork_core.perfcheck.log] Task 'url_to_pillow(file:///home/uni/papers/20240124_2151_26/paper.5.png)' took 211ms (> 200ms) ! ({'size': (2552, 3508)})
[WARNING] [openpaperwork_core.perfcheck.log] Task 'url_to_pillow(file:///home/uni/papers/20240124_2151_26/paper.6.png)' took 226ms (> 200ms) ! ({'size': (2552, 3508)})
[1]    34420 segmentation fault (core dumped)  paperwork

The logfile ends with

Fatal Python error: Segmentation fault

Thread 0x00007f617d7fa6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 629 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_gtk/mainloop/glib.py", line 228 in mainloop_execute
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/__init__.py", line 453 in call_one
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_gtk/widgets/progress/__init__.py", line 90 in _thread
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 982 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f617dffb6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f617e7fc6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f617effd6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f617f7fe6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f617ffff6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f61a0ff96c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f61a17fa6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f61a1ffb6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f61a27fc6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 629 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_gtk/mainloop/glib.py", line 228 in mainloop_execute
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/__init__.py", line 453 in call_one
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/paperwork_backend/docexport/pdf.py", line 282 in do
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/promise.py", line 235 in _threaded_do
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/__init__.py", line 27 in do
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 27 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f61b09496c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f61a37fe6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Thread 0x00007f61a2ffd6c0 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 327 in wait
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/queue.py", line 171 in get
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/thread/pool.py", line 24 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1045 in _bootstrap_inner
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/threading.py", line 1002 in _bootstrap

Current thread 0x00007f6200823580 (most recent call first):
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/paperwork_backend/docexport/pdf.py", line 201 in next_page
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_gtk/mainloop/glib.py", line 218 in get_result
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_gtk/mainloop/glib.py", line 160 in decorator
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/gi/overrides/GLib.py", line 497 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_gtk/mainloop/glib.py", line 66 in mainloop
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/__init__.py", line 453 in call_one
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_gtk/gtk_init.py", line 88 in _on_activate
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/paperwork_gtk/main.py", line 193 in gtk_main
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/gi/overrides/Gio.py", line 42 in run
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_gtk/gtk_init.py", line 70 in gtk_init
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/openpaperwork_core/__init__.py", line 405 in call_all
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/paperwork_gtk/main.py", line 218 in main_main
  File "/tmp/.mount_paperwAiLj3k/usr/lib/python3.11/site-packages/paperwork_gtk/main.py", line 236 in main
  File "/tmp/.mount_paperwAiLj3k/usr/bin/paperwork-gtk", line 8 in <module>
Extension modules: ...

Everything above that doesn’t seem relevant, but if it helps I’ll upload the full log too.

I’m currently using the AppImage version, but this also happened on the 2.1.2 official .deb and the self-compiled dev version.
When I delete all the .words files in a document’s folder, the export works, so it ought to be related to the OCR.
The .words file are all valid XHTML though so it seems to go beyond simple corruption issues.
Any ideas?

After even more investigating,
the error is caused by self.pdf_context.save() on line 136, in paperwork_backend/docexport/pdf.py.
This more or less only wraps the cairo_save C function, no clue what might cause this though.

Oh I just saw the gitlab issue, I’ll move the issue there.