Pillow icon indicating copy to clipboard operation
Pillow copied to clipboard

Segmentation fault for converting jp2 file on ArchLinux

Open mamome2021 opened this issue 2 months ago • 13 comments

What did you do?

  1. On ArchLinux, install with pacman -S python-pillow python-pymupdf
  2. Run python test.py

What did you expect to happen?

out.png created

What actually happened?

Segmentation fault (core dumped) python test.py

What are your OS, Python and Pillow versions?

  • OS: ArchLinux
  • Python: 3.13.7
  • Pillow: 12.0.0
--------------------------------------------------------------------
Pillow 12.0.0
Python 3.13.7 (main, Aug 15 2025, 12:34:02) [GCC 15.2.1 20250813]
--------------------------------------------------------------------
Python executable is /usr/sbin/python3
System Python files loaded from /usr
--------------------------------------------------------------------
Python Pillow modules loaded from /usr/lib/python3.13/site-packages/PIL
Binary Pillow modules loaded from /usr/lib/python3.13/site-packages/PIL
--------------------------------------------------------------------
--- PIL CORE support ok, compiled for 12.0.0
/usr/lib/python3.13/site-packages/PIL/features.py:43: UserWarning: libtk8.6.so: cannot open shared object file: No such file or directory
  warnings.warn(str(ex))
*** TKINTER support not installed
--- FREETYPE2 support ok, loaded 2.14.1
--- LITTLECMS2 support ok, loaded 2.17
--- WEBP support ok, loaded 1.6.0
--- AVIF support ok, loaded 1.3.0
--- JPEG support ok, compiled for libjpeg-turbo 3.1.2
--- OPENJPEG (JPEG2000) support ok, loaded 2.5.4
--- ZLIB (PNG/ZIP) support ok, loaded 1.3.1
--- LIBTIFF support ok, loaded 4.7.1
--- RAQM (Bidirectional Text) support ok, loaded 0.10.3
--- LIBIMAGEQUANT (Quantization method) support ok, loaded 4.2.2
--- XCB (X protocol) support ok
--------------------------------------------------------------------

Content of test.py:

import pymupdf
from PIL import Image
image1 = Image.open('test.jp2')
image1.save('out.png')

Test image file:

test.jp2.zip

I have this error only if pymupdf and pillow are installed from Arch repository, if I install from pip no error happens. Also if I remove import pymupdf or import pymupdf after importing PIL, no error happens.

mamome2021 avatar Oct 18 '25 04:10 mamome2021

Hi. A few questions.

  1. Is this something that only started happening recently? For example, was this perhaps triggered by the release of Pillow 12?
  2. You mention that you tried installing Pillow from pip and found that it passed. Does it pass if you install Pillow from source, rather than from a wheel?
  3. I suppose you've considered reporting this to https://gitlab.archlinux.org/archlinux/packaging/packages/python-pymupdf or https://gitlab.archlinux.org/archlinux/packaging/packages/python-pillow?

radarhere avatar Oct 18 '25 08:10 radarhere

  1. I tried Pillow 11.0.0 and same problem.
  2. Same problem if I use pip install --no-binary :all: pillow to install.
  3. I do not have an account for gitlab.archlinux.org, I will report there once I get approved.
  4. Stack trace for segfault:
Program received signal SIGSEGV, Segmentation fault.
0x00007f41ad6b6402 in ?? () from /usr/lib/libmupdf.so.26.10

Thread 1 (Thread 0x7f41b10e1bc0 (LWP 704) "python"):
#0  0x00007f41ad6b6402 in ?? () from /usr/lib/libmupdf.so.26.10
No symbol table info available.
#1  0x00007f41ad6b9d2a in fz_calloc_no_throw () from /usr/lib/libmupdf.so.26.10
No symbol table info available.
#2  0x00007f41accdafd7 in opj_stream_create (p_buffer_size=p_buffer_size@entry=1048576, l_is_input=l_is_input@entry=1) at /usr/src/debug/openjpeg2/openjpeg-2.5.4/src/lib/openjp2/cio.c:162
        l_stream = 0x0
#3  0x00007f41a7ccfa52 in j2k_decode_entry (im=0x556a332c6c10, state=0x7f419e5ec440) at src/libImaging/Jpeg2KDecode.c:649
        context = 0x556a33970620
        stream = 0x0
        image = 0x0
        codec = 0x0
        params = {cp_reduce = 3423896503, cp_layer = 1769372142, infile = "@3\306g\374\177\000\000\3402\306g\374\177\000\000\001\000\000\000\b\000\000\000\267\203\324\314\356yvi\000\000\000\000\000\000\000\000\2402\306g\374\177\000\000\000\000\000\000\000\000\000\000\267\203\224\314\356yvi\b\000\000\000\000\000\000\000\b", '\000' <repeats 23 times>, "pr\0343jU\000\000\3009\306g\374\177\000\000\345㛱A\177\000\000\001\000\000\000A\177\000\000\240]\237\261A\177\000\000\000\000\000\000\000\000\000\000\243ܛ\261A\177\000\000\001\000\000\000A\177\000\000`\252\232\261A\177\000\000\2203\306g\374\177\000\000\243ܛ\261A\177\000\000\001\000\000\000A\177\000\000p\257G3jU\000\000\2603\306g"..., outfile = "\000\236\364\026\377\274\221\350\377\377\377\377\000\000\003\000\240\304ӧA\177\000\000\360m\223\261A\177\000\000p\213\000\261A\177\000\000\000\000\000\000\000\000\000\000\240\304ӧA\177\000\000\220C\306g\374\177\000\000\226\274Z\261A\177\000\000\000\000\000\000\000\000\000\000`\365`\236A\177\000\000 D\306g\374\177\000\000\000\236\364\026\377\274\221\350\001\000\000\000\000\000\000\000@j`\236A\177\000\000\240T\306g\374\177\000\000\261\aV\261A\177\000\0000D\306g\374\177\000\000\001", '\000' <repeats 15 times>, "P\214̨A\177\000\000\202\351\322\317cw\203\n\000\236\364\026\377\274\221\350\000\000\000\000A\177\000\000\002\000\000\000\000\000\000\000XL\306"..., decod_format = -1637956576, cod_format = 32577, DA_x0 = 2979717928, DA_x1 = 32577, DA_y0 = 2657154960, DA_y1 = 32577, m_verbose = 1741050896, tile_index = 32764, nb_tile_to_decode = 2975229324, jpwl_correct = 32577, jpwl_exp_comps = 24, jpwl_max_tiles = 48, flags = 1741050912}
        color_space = <optimized out>
        unpack = 0x0
        tile_bytes = 0
        n = <optimized out>
        tile_height = <optimized out>
        tile_width = <optimized out>
        subsampling = <optimized out>
        total_component_width = 0
        quick_exit = <optimized out>
#4  0x00007f41a7cd00b0 in ImagingJpeg2KDecode (buf=<optimized out>, bytes=<optimized out>, im=<optimized out>, state=<optimized out>) at src/libImaging/Jpeg2KDecode.c:948
No locals.
#5  ImagingJpeg2KDecode (im=<optimized out>, state=<optimized out>, buf=<optimized out>, bytes=<optimized out>) at src/libImaging/Jpeg2KDecode.c:934
No locals.
#6  0x00007f41a7ca45cc in _decode (decoder=0x7f419e5ec420, args=<optimized out>) at src/decode.c:132
        buffer = {buf = 0x7f41b18f7350 <_PyRuntime+22256>, obj = 0x7f41b18f7330 <_PyRuntime+22224>, len = 0, itemsize = 1, readonly = 1, ndim = 1, format = 0x0, shape = 0x0, strides = 0x0, suboffsets = 0x0, internal = 0x0}
        status = <optimized out>
        cookie = 0xe891bcff16f49e00
#7  0x00007f41b161eca7 in method_vectorcall_VARARGS (func=0x7f419e60f6a0, args=0x7f41b19ae328, nargsf=<optimized out>, kwnames=<optimized out>) at Objects/descrobject.c:324
        tstate = <optimized out>
        nargs = <optimized out>
        argstuple = <optimized out>
        meth = <optimized out>
        result = <optimized out>
#8  0x00007f41b15685bd in _PyObject_VectorcallTstate (tstate=0x7f41b1936df0 <_PyRuntime+283024>, callable=0x7f419e60f6a0, args=0x7f41b19ae328, nargsf=9223372036854775810, kwnames=0x0) at ./Include/internal/pycore_call.h:168
        func = <optimized out>
        res = <optimized out>
        nargs = <optimized out>
#9  PyObject_Vectorcall (callable=0x7f419e60f6a0, args=0x7f41b19ae328, nargsf=9223372036854775810, kwnames=0x0) at Objects/call.c:327
        tstate = 0x7f41b1936df0 <_PyRuntime+283024>
#10 0x00007f41b157a97a in _PyEval_EvalFrameDefault (tstate=<optimized out>, frame=<optimized out>, throwflag=<optimized out>) at Python/generated_cases.c.h:813
        total_args = <optimized out>
        self_or_null = <optimized out>
        callable = 0x7f419e60f6a0
        this_instr = <optimized out>
        args = 0x7f41b19ae328
        res = <optimized out>
        opcode = <optimized out>
        oparg = <optimized out>
        entry_frame = {f_executable = 0x7f41b18e9150 <_Py_NoneStruct>, previous = 0x0, f_funcobj = 0x7ffc67c656d0, f_globals = 0x7f41b0e5c080, f_builtins = 0x7f41b18fbd58 <_PyRuntime+41208>, f_locals = 0x7f41b0e5c080, frame_obj = 0x7ffc67c65720, instr_ptr = 0x7f41b17d5482 <_Py_INTERPRETER_TRAMPOLINE_INSTRUCTIONS+2>, stacktop = 0, return_offset = 0, owner = 3 '\003', localsplus = {0x7f41b1936df0 <_PyRuntime+283024>}}
        next_instr = <optimized out>
        stack_pointer = <optimized out>
        exception_unwind = <optimized out>
        dying = <optimized out>
        __func__ = "_PyEval_EvalFrameDefault"
        opcode_targets = {0x7f41b14580b1 <_PyEval_EvalFrameDefault-1173487>, 0x7f41b1455986 <_PyEval_EvalFrameDefault-1183514>, 0x7f41b157c978 <_PyEval_EvalFrameDefault+24792>, 0x7f41b157cc3d <_PyEval_EvalFrameDefault+25501>, 0x7f41b157ace6 <_PyEval_EvalFrameDefault+17478>, 0x7f41b15795f3 <_PyEval_EvalFrameDefault+11603>, 0x7f41b1453578 <_PyEval_EvalFrameDefault-1192744>, 0x7f41b157c2f5 <_PyEval_EvalFrameDefault+23125>, 0x7f41b157df6b <_PyEval_EvalFrameDefault+30411>, 0x7f41b157c618 <_PyEval_EvalFrameDefault+23928>, 0x7f41b145677c <_PyEval_EvalFrameDefault-1179940>, 0x7f41b157e4d4 <_PyEval_EvalFrameDefault+31796>, 0x7f41b157d9d4 <_PyEval_EvalFrameDefault+28980>, 0x7f41b157cd9e <_PyEval_EvalFrameDefault+25854>, 0x7f41b157c6f3 <_PyEval_EvalFrameDefault+24147>, 0x7f41b157cd10 <_PyEval_EvalFrameDefault+25712>, 0x7f41b1459056 <_PyEval_EvalFrameDefault-1169482>, 0x7f41b14545b4 <_PyEval_EvalFrameDefault-1188588>, 0x7f41b1458f7a <_PyEval_EvalFrameDefault-1169702>, 0x7f41b1579899 <_PyEval_EvalFrameDefault+12281>, 0x7f41b157ea7d <_PyEval_EvalFrameDefault+33245>, 0x7f41b157e9f2 <_PyEval_EvalFrameDefault+33106>, 0x7f41b157734c <_PyEval_EvalFrameDefault+2732>, 0x7f41b1457da1 <_PyEval_EvalFrameDefault-1174271>, 0x7f41b157eb66 <_PyEval_EvalFrameDefault+33478>, 0x7f41b157e488 <_PyEval_EvalFrameDefault+31720>, 0x7f41b157bf69 <_PyEval_EvalFrameDefault+22217>, 0x7f41b157f2d4 <_PyEval_EvalFrameDefault+35380>, 0x7f41b157f281 <_PyEval_EvalFrameDefault+35297>, 0x7f41b157d981 <_PyEval_EvalFrameDefault+28897>, 0x7f41b15795c5 <_PyEval_EvalFrameDefault+11557>, 0x7f41b157bdeb <_PyEval_EvalFrameDefault+21835>, 0x7f41b15770b5 <_PyEval_EvalFrameDefault+2069>, 0x7f41b157c165 <_PyEval_EvalFrameDefault+22725>, 0x7f41b1576cfe <_PyEval_EvalFrameDefault+1118>, 0x7f41b157c03b <_PyEval_EvalFrameDefault+22427>, 0x7f41b15772c2 <_PyEval_EvalFrameDefault+2594>, 0x7f41b157da43 <_PyEval_EvalFrameDefault+29091>, 0x7f41b157ca9f <_PyEval_EvalFrameDefault+25087>, 0x7f41b157b366 <_PyEval_EvalFrameDefault+19142>, 0x7f41b157937e <_PyEval_EvalFrameDefault+10974>, 0x7f41b157e130 <_PyEval_EvalFrameDefault+30864>, 0x7f41b157c51d <_PyEval_EvalFrameDefault+23677>, 0x7f41b157c57d <_PyEval_EvalFrameDefault+23773>, 0x7f41b157e373 <_PyEval_EvalFrameDefault+31443>, 0x7f41b157791a <_PyEval_EvalFrameDefault+4218>, 0x7f41b157e287 <_PyEval_EvalFrameDefault+31207>, 0x7f41b157ab97 <_PyEval_EvalFrameDefault+17143>, 0x7f41b157a507 <_PyEval_EvalFrameDefault+15463>, 0x7f41b157deb6 <_PyEval_EvalFrameDefault+30230>, 0x7f41b157d3df <_PyEval_EvalFrameDefault+27455>, 0x7f41b157c7f7 <_PyEval_EvalFrameDefault+24407>, 0x7f41b15796cc <_PyEval_EvalFrameDefault+11820>, 0x7f41b157a898 <_PyEval_EvalFrameDefault+16376>, 0x7f41b157bbfc <_PyEval_EvalFrameDefault+21340>, 0x7f41b157e959 <_PyEval_EvalFrameDefault+32953>, 0x7f41b157e8bd <_PyEval_EvalFrameDefault+32797>, 0x7f41b157942a <_PyEval_EvalFrameDefault+11146>, 0x7f41b15787d8 <_PyEval_EvalFrameDefault+7992>, 0x7f41b1579add <_PyEval_EvalFrameDefault+12861>, 0x7f41b157d58b <_PyEval_EvalFrameDefault+27883>, 0x7f41b15785e5 <_PyEval_EvalFrameDefault+7493>, 0x7f41b1577cdf <_PyEval_EvalFrameDefault+5183>, 0x7f41b157bb81 <_PyEval_EvalFrameDefault+21217>, 0x7f41b157e516 <_PyEval_EvalFrameDefault+31862>, 0x7f41b157dffb <_PyEval_EvalFrameDefault+30555>, 0x7f41b1458594 <_PyEval_EvalFrameDefault-1172236>, 0x7f41b157e41d <_PyEval_EvalFrameDefault+31613>, 0x7f41b157c3dc <_PyEval_EvalFrameDefault+23356>, 0x7f41b157e1f5 <_PyEval_EvalFrameDefault+31061>, 0x7f41b1454b0a <_PyEval_EvalFrameDefault-1187222>, 0x7f41b157a252 <_PyEval_EvalFrameDefault+14770>, 0x7f41b15776ae <_PyEval_EvalFrameDefault+3598>, 0x7f41b157ead7 <_PyEval_EvalFrameDefault+33335>, 0x7f41b157ed38 <_PyEval_EvalFrameDefault+33944>, 0x7f41b157daff <_PyEval_EvalFrameDefault+29279>, 0x7f41b1578631 <_PyEval_EvalFrameDefault+7569>, 0x7f41b1576d39 <_PyEval_EvalFrameDefault+1177>, 0x7f41b157a5af <_PyEval_EvalFrameDefault+15631>, 0x7f41b1579dff <_PyEval_EvalFrameDefault+13663>, 0x7f41b15780da <_PyEval_EvalFrameDefault+6202>, 0x7f41b157dd3e <_PyEval_EvalFrameDefault+29854>, 0x7f41b1577af0 <_PyEval_EvalFrameDefault+4688>, 0x7f41b1576a6e <_PyEval_EvalFrameDefault+462>, 0x7f41b1577658 <_PyEval_EvalFrameDefault+3512>, 0x7f41b157699b <_PyEval_EvalFrameDefault+251>, 0x7f41b157bd9f <_PyEval_EvalFrameDefault+21759>, 0x7f41b157d5fe <_PyEval_EvalFrameDefault+27998>, 0x7f41b1576abe <_PyEval_EvalFrameDefault+542>, 0x7f41b157f00c <_PyEval_EvalFrameDefault+34668>, 0x7f41b14554e7 <_PyEval_EvalFrameDefault-1184697>, 0x7f41b157d64e <_PyEval_EvalFrameDefault+28078>, 0x7f41b157c8ef <_PyEval_EvalFrameDefault+24655>, 0x7f41b157f0ce <_PyEval_EvalFrameDefault+34862>, 0x7f41b157be6f <_PyEval_EvalFrameDefault+21967>, 0x7f41b157d758 <_PyEval_EvalFrameDefault+28344>, 0x7f41b157ef4a <_PyEval_EvalFrameDefault+34474>, 0x7f41b1576c40 <_PyEval_EvalFrameDefault+928>, 0x7f41b1578bf7 <_PyEval_EvalFrameDefault+9047>, 0x7f41b1578765 <_PyEval_EvalFrameDefault+7877>, 0x7f41b1576c9f <_PyEval_EvalFrameDefault+1023>, 0x7f41b157dc68 <_PyEval_EvalFrameDefault+29640>, 0x7f41b157cde2 <_PyEval_EvalFrameDefault+25922>, 0x7f41b1576f6f <_PyEval_EvalFrameDefault+1743>, 0x7f41b157aa7b <_PyEval_EvalFrameDefault+16859>, 0x7f41b157ae3f <_PyEval_EvalFrameDefault+17823>, 0x7f41b157c5c9 <_PyEval_EvalFrameDefault+23849>, 0x7f41b157de3d <_PyEval_EvalFrameDefault+30109>, 0x7f41b157ac00 <_PyEval_EvalFrameDefault+17248>, 0x7f41b157c693 <_PyEval_EvalFrameDefault+24051>, 0x7f41b15769e7 <_PyEval_EvalFrameDefault+327>, 0x7f41b1577f51 <_PyEval_EvalFrameDefault+5809>, 0x7f41b15784da <_PyEval_EvalFrameDefault+7226>, 0x7f41b157e7a9 <_PyEval_EvalFrameDefault+32521>, 0x7f41b157c483 <_PyEval_EvalFrameDefault+23523>, 0x7f41b1578f95 <_PyEval_EvalFrameDefault+9973>, 0x7f41b157ddb3 <_PyEval_EvalFrameDefault+29971>, 0x7f41b157e057 <_PyEval_EvalFrameDefault+30647>, 0x7f41b1578d8a <_PyEval_EvalFrameDefault+9450>, 0x7f41b1458516 <_PyEval_EvalFrameDefault-1172362> <repeats 30 times>, 0x7f41b157a791 <_PyEval_EvalFrameDefault+16113>, 0x7f41b157b063 <_PyEval_EvalFrameDefault+18371>, 0x7f41b15782ca <_PyEval_EvalFrameDefault+6698>, 0x7f41b157b286 <_PyEval_EvalFrameDefault+18918>, 0x7f41b1577c4f <_PyEval_EvalFrameDefault+5039>, 0x7f41b1579a2f <_PyEval_EvalFrameDefault+12687>, 0x7f41b157a181 <_PyEval_EvalFrameDefault+14561>, 0x7f41b1578a91 <_PyEval_EvalFrameDefault+8689>, 0x7f41b157a3f3 <_PyEval_EvalFrameDefault+15187>, 0x7f41b157d824 <_PyEval_EvalFrameDefault+28548>, 0x7f41b1578b3f <_PyEval_EvalFrameDefault+8863>, 0x7f41b157836f <_PyEval_EvalFrameDefault+6863>, 0x7f41b157b0f8 <_PyEval_EvalFrameDefault+18520>, 0x7f41b157d0c1 <_PyEval_EvalFrameDefault+26657>, 0x7f41b15790e1 <_PyEval_EvalFrameDefault+10305>, 0x7f41b157a007 <_PyEval_EvalFrameDefault+14183>, 0x7f41b1578900 <_PyEval_EvalFrameDefault+8288>, 0x7f41b1577dd4 <_PyEval_EvalFrameDefault+5428>, 0x7f41b157a288 <_PyEval_EvalFrameDefault+14824>, 0x7f41b15770f7 <_PyEval_EvalFrameDefault+2135>, 0x7f41b15781c7 <_PyEval_EvalFrameDefault+6439>, 0x7f41b1578fdc <_PyEval_EvalFrameDefault+10044>, 0x7f41b157b1c6 <_PyEval_EvalFrameDefault+18726>, 0x7f41b157775a <_PyEval_EvalFrameDefault+3770>, 0x7f41b1579c5e <_PyEval_EvalFrameDefault+13246>, 0x7f41b15798f9 <_PyEval_EvalFrameDefault+12377>, 0x7f41b157b572 <_PyEval_EvalFrameDefault+19666>, 0x7f41b1577a08 <_PyEval_EvalFrameDefault+4456>, 0x7f41b1577405 <_PyEval_EvalFrameDefault+2917>, 0x7f41b1578c66 <_PyEval_EvalFrameDefault+9158>, 0x7f41b157b467 <_PyEval_EvalFrameDefault+19399>, 0x7f41b157cba4 <_PyEval_EvalFrameDefault+25348>, 0x7f41b1578063 <_PyEval_EvalFrameDefault+6083>, 0x7f41b157a5e5 <_PyEval_EvalFrameDefault+15685>, 0x7f41b1576e8a <_PyEval_EvalFrameDefault+1514>, 0x7f41b1579738 <_PyEval_EvalFrameDefault+11928>, 0x7f41b157b6cf <_PyEval_EvalFrameDefault+20015>, 0x7f41b157bab4 <_PyEval_EvalFrameDefault+21012>, 0x7f41b157b78b <_PyEval_EvalFrameDefault+20203>, 0x7f41b1578455 <_PyEval_EvalFrameDefault+7093>, 0x7f41b157813a <_PyEval_EvalFrameDefault+6298>, 0x7f41b157a714 <_PyEval_EvalFrameDefault+15988>, 0x7f41b157d028 <_PyEval_EvalFrameDefault+26504>, 0x7f41b145397f <_PyEval_EvalFrameDefault-1191713>, 0x7f41b1577010 <_PyEval_EvalFrameDefault+1904>, 0x7f41b1579f80 <_PyEval_EvalFrameDefault+14048>, 0x7f41b157738f <_PyEval_EvalFrameDefault+2799>, 0x7f41b1577bba <_PyEval_EvalFrameDefault+4890>, 0x7f41b1578edd <_PyEval_EvalFrameDefault+9789>, 0x7f41b157ebd2 <_PyEval_EvalFrameDefault+33586>, 0x7f41b157adab <_PyEval_EvalFrameDefault+17675>, 0x7f41b157b883 <_PyEval_EvalFrameDefault+20451>, 0x7f41b1577fca <_PyEval_EvalFrameDefault+5930>, 0x7f41b157b9c3 <_PyEval_EvalFrameDefault+20771>, 0x7f41b1576b73 <_PyEval_EvalFrameDefault+723>, 0x7f41b1576d85 <_PyEval_EvalFrameDefault+1253>, 0x7f41b157ec47 <_PyEval_EvalFrameDefault+33703>, 0x7f41b157c1ce <_PyEval_EvalFrameDefault+22830>, 0x7f41b1576b31 <_PyEval_EvalFrameDefault+657>, 0x7f41b157c73c <_PyEval_EvalFrameDefault+24220>, 0x7f41b1578e1e <_PyEval_EvalFrameDefault+9598>, 0x7f41b1579bd6 <_PyEval_EvalFrameDefault+13110>, 0x7f41b157e1ad <_PyEval_EvalFrameDefault+30989>, 0x7f41b1579e9d <_PyEval_EvalFrameDefault+13821>, 0x7f41b157a7dd <_PyEval_EvalFrameDefault+16189>, 0x7f41b157aeb7 <_PyEval_EvalFrameDefault+17943>, 0x7f41b1576e46 <_PyEval_EvalFrameDefault+1446>, 0x7f41b1579e31 <_PyEval_EvalFrameDefault+13713>, 0x7f41b157c36d <_PyEval_EvalFrameDefault+23245>, 0x7f41b157984d <_PyEval_EvalFrameDefault+12205>, 0x7f41b157b4f7 <_PyEval_EvalFrameDefault+19543>...}
        word = <optimized out>
        word = <optimized out>
#11 0x00007f41b16522c9 in PyEval_EvalCode (co=0x7f41b102dde0, globals=<optimized out>, locals=0x7f41b0e5c080) at Python/ceval.c:604
        tstate = 0x7f41b1936df0 <_PyRuntime+283024>
        builtins = <optimized out>
        desc = {fc_globals = 0x7f41b0e5c080, fc_builtins = 0x7f41b1031dc0, fc_name = 0x7f41b18fa438 <_PyRuntime+34776>, fc_qualname = 0x7f41b18fa438 <_PyRuntime+34776>, fc_code = 0x7f41b102dde0, fc_defaults = 0x0, fc_kwdefaults = 0x0, fc_closure = 0x0}
        func = 0x7f41b1059440
        res = <optimized out>
#12 0x00007f41b169088c in run_eval_code_obj (tstate=tstate@entry=0x7f41b1936df0 <_PyRuntime+283024>, co=co@entry=0x7f41b102dde0, globals=globals@entry=0x7f41b0e5c080, locals=locals@entry=0x7f41b0e5c080) at Python/pythonrun.c:1381
        v = <optimized out>
        has_builtins = <optimized out>
#13 0x00007f41b168d85d in run_mod (mod=mod@entry=0x556a33244eb0, filename=filename@entry=0x7f41b0e5c1b0, globals=globals@entry=0x7f41b0e5c080, locals=locals@entry=0x7f41b0e5c080, flags=flags@entry=0x7ffc67c65988, arena=arena@entry=0x7f41b0fa3cd0, interactive_src=0x0, generate_new_source=0) at Python/pythonrun.c:1466
        tstate = 0x7f41b1936df0 <_PyRuntime+283024>
        interactive_filename = <optimized out>
        co = 0x7f41b102dde0
        v = <optimized out>
#14 0x00007f41b168af58 in pyrun_file (fp=fp@entry=0x556a33176350, filename=filename@entry=0x7f41b0e5c1b0, start=start@entry=257, globals=globals@entry=0x7f41b0e5c080, locals=locals@entry=0x7f41b0e5c080, closeit=closeit@entry=1, flags=0x7ffc67c65988) at Python/pythonrun.c:1295
        arena = 0x7f41b0fa3cd0
        mod = <optimized out>
        ret = <optimized out>
#15 0x00007f41b168a212 in _PyRun_SimpleFileObject (fp=fp@entry=0x556a33176350, filename=filename@entry=0x7f41b0e5c1b0, closeit=closeit@entry=1, flags=flags@entry=0x7ffc67c65988) at Python/pythonrun.c:517
        ret = <optimized out>
        main_module = 0x7f41b0e35c10
        dict = 0x7f41b0e5c080
        set_file_name = 1
        has_file = <optimized out>
        pyc = <optimized out>
        v = <optimized out>
#16 0x00007f41b1689b83 in _PyRun_AnyFileObject (fp=fp@entry=0x556a33176350, filename=filename@entry=0x7f41b0e5c1b0, closeit=closeit@entry=1, flags=flags@entry=0x7ffc67c65988) at Python/pythonrun.c:77
        decref_filename = 0
        res = <optimized out>
#17 0x00007f41b1687e51 in pymain_run_file_obj (program_name=0x7f41b0e5c1f0, filename=0x7f41b0e5c1b0, skip_source_first_line=0) at Modules/main.c:410
        fp = 0x556a33176350
        sb = {st_dev = 2063, st_ino = 11010310, st_nlink = 1, st_mode = 33188, st_uid = 1000, st_gid = 1000, __pad0 = 0, st_rdev = 0, st_size = 92, st_blksize = 4096, st_blocks = 8, st_atim = {tv_sec = 1760757095, tv_nsec = 167296131}, st_mtim = {tv_sec = 1760757095, tv_nsec = 167296131}, st_ctim = {tv_sec = 1760757095, tv_nsec = 207295590}, __glibc_reserved = {0, 0, 0}}
        cf = {cf_flags = 0, cf_feature_version = 13}
        run = <optimized out>
#18 pymain_run_file (config=0x7f41b19094e8 <_PyRuntime+96392>) at Modules/main.c:429
        filename = 0x7f41b0e5c1b0
        program_name = 0x7f41b0e5c1f0
        res = <optimized out>
#19 pymain_run_python (exitcode=0x7ffc67c6597c) at Modules/main.c:696
        main_importer_path = <optimized out>
        interp = 0x7f41b19075b0 <_PyRuntime+88400>
        config = 0x7f41b19094e8 <_PyRuntime+96392>
        path0 = 0x7f41b0e57b70
#20 Py_RunMain () at Modules/main.c:775
        exitcode = 0
#21 0x00007f41b163fbeb in Py_BytesMain (argc=<optimized out>, argv=<optimized out>) at Modules/main.c:829
        args = {argc = 2, use_bytes_argv = 1, bytes_argv = 0x7ffc67c65be8, wchar_argv = 0x0}
#22 0x00007f41b1218675 in __libc_start_call_main (main=main@entry=0x556a1df1a120 <main>, argc=argc@entry=2, argv=argv@entry=0x7ffc67c65be8) at ../sysdeps/nptl/libc_start_call_main.h:58
        self = <optimized out>
        result = <optimized out>
        unwind_buf = {cancel_jmp_buf = {{jmp_buf = {0, 7599395484873294775, 140722049539048, 2, 139920129609728, 93914257280448, 7599395484829254583, 7497882195609682871}, mask_was_saved = 0}}, priv = {pad = {0x0, 0x0, 0x0, 0x7ffc67c65be8}, data = {prev = 0x0, cleanup = 0x0, canceltype = 0}}}
        not_first_call = <optimized out>
#23 0x00007f41b1218729 in __libc_start_main_impl (main=0x556a1df1a120 <main>, argc=2, argv=0x7ffc67c65be8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7ffc67c65bd8) at ../csu/libc-start.c:360
No locals.
#24 0x0000556a1df1a045 in _start ()
No symbol table info available.

Probably the problem is not in pillow?

mamome2021 avatar Oct 20 '25 03:10 mamome2021

Thanks very much. Please provide a link to the gitlab.archlinux.org issue when you have created it.

radarhere avatar Oct 20 '25 07:10 radarhere

Link to Arch Linux issue: https://gitlab.archlinux.org/archlinux/packaging/packages/python-pillow/-/issues/4

mamome2021 avatar Oct 21 '25 03:10 mamome2021

As an update, discussion in the Arch Linux issue suggests that this might be a pymupdf issue instead.

The thread has since moved to mupdf - https://gitlab.archlinux.org/archlinux/packaging/packages/mupdf/-/issues/18

radarhere avatar Oct 23 '25 10:10 radarhere

If I use pacman -Sy --noconfirm python-pillow python-pymupdf to install both packages from Arch Linux, then I see a segfault - https://github.com/radarhere/docker-images/actions/runs/19292792113/job/55167267465 If I install Pillow from pip, I don't - https://github.com/radarhere/docker-images/actions/runs/19292808895/job/55167323900 If I install PyMuPDF from pip, I don't - https://github.com/radarhere/docker-images/actions/runs/19292827832/job/55167384805

Going through your trace, Pillow would call opj_stream_create. Looking at https://fossies.org/dox/mupdf-1.26.10-source/load-jpx_8c_source.html, I suspect I've found how opj_stream_create connects to the next item in your trace, fz_calloc_no_throw - it calls opj_calloc.

void *opj_calloc(size_t n, size_t size)
{
    fz_context *ctx = get_opj_context();
 
    assert(ctx != NULL);
 
    return fz_calloc_no_throw(ctx, n, size);
}

So I think the problem is that the pymupdf Arch Linux package is changing the normal operation of OpenJPEG, and then that is re-used by the Arch Linux package of Pillow, and causes the segfault.

I don't think Pillow can be held responsible for the fact that OpenJPEG has this unexpected call to fz_calloc_no_throw inserted into the mix. It seems unlikely that Pillow is making any incorrect calls to OpenJPEG, and far more likely that https://gitlab.archlinux.org/archlinux/packaging/packages/python-pymupdf needs to isolate its modifications of OpenJPEG from the rest of the ecosystem.

radarhere avatar Nov 12 '25 09:11 radarhere

Over at https://gitlab.archlinux.org/archlinux/packaging/packages/python-pillow/-/issues/4, you reported

This only happens if python-pillow and python-pymupdf is installed from Arch repository, does not happen if I install them from pip.

Did you want to reconsider your comment earlier in this thread? https://github.com/python-pillow/Pillow/issues/9267#issuecomment-3420377733

Same problem if I use pip install --no-binary :all: pillow to install.

radarhere avatar Nov 12 '25 11:11 radarhere

https://github.com/pymupdf/PyMuPDF/issues/4762 has led to https://bugs.ghostscript.com/show_bug.cgi?id=708929

Looks like importing pymupdf loads mupdf's openjpeg into current process, then importing and using Pillow uses mupdf's openjpeg instead of the system openjpeg. This fails, possibly because mupdf:source/fitz/load-jpx.c:opj_secret is null until mupdf uses its openjpeg.

radarhere avatar Nov 12 '25 20:11 radarhere

I have an application that segfaulted on loading images from a byte array on Linux Mint 22.1 but works no problemo with Ubuntu 25.04, pillow 12.0.0 on both setups. I rewrote the program to not use Pillow but instead reading the byte array into a PyQt6 QPixmap and now it works on all machines tested.

Here's a cut out from the code that segfaulted:

import mutagen
from PIL import Image, ImageQt

_f = mutagen.File(_obj.file)
_data = _f.tags["APIC:Cover"].data
_image = Image.open(BytesIO(_data))
_cover = QPixmap.fromImage(ImageQt(_image))   # < SEGFAULT

This works:

_obj.image = f.tags["APIC:Cover"].data
_pxmap = QPixmap()
_pxmap.loadFromData(playable.image)
_cover = _pxmap.scaled(120, 120,
        Qt.AspectRatioMode.KeepAspectRatio,
        Qt.TransformationMode.SmoothTransformation)

This issue is the closest I've got to get an understanding of my problem, but may be unrelated.

svenakela avatar Nov 22 '25 17:11 svenakela

The error in this issue specifically relates to mupdf.

If you'd like help investigating your problem, please create a new issue. It would be great if you could include a stacktrace, or a Dockerfile that demonstrates the segfault.

radarhere avatar Nov 23 '25 02:11 radarhere

https://bugs.ghostscript.com/show_bug.cgi?id=708929 is apparently fixed in https://cgit.ghostscript.com/cgi-bin/cgit.cgi/mupdf.git/commit/?id=b54895c66776765277299606a3e87f5f1bf1688e

The next step would be waiting for another mupdf release.

radarhere avatar Dec 05 '25 02:12 radarhere

mupdf 1.26.12-2 has been created for Arch Linux!

@mamome2021 would you be able to try again?

radarhere avatar Dec 07 '25 23:12 radarhere

Testing with a recent mirror, I find that this is now resolved - https://github.com/radarhere/docker-images/actions/runs/20131615275

FROM greyltc/archlinux

RUN echo "Server = https://plug-mirror.rcac.purdue.edu/archlinux/\$repo/os/\$arch" > /etc/pacman.d/mirrorlist

RUN pacman -Sy --noconfirm --overwrite "*libedit*,*readline.h,*histedit.h" libedit

RUN pacman -Sy --noconfirm python-pillow python-pymupdf

ADD test.jp2 /test.jp2
RUN python3 -c "import pymupdf;from PIL import Image;image1 = Image.open('test.jp2');image1.save('out.png')"

radarhere avatar Dec 11 '25 11:12 radarhere

Closing this issue as no feedback has been received.

github-actions[bot] avatar Dec 18 '25 17:12 github-actions[bot]