Segfault when calling show() after using Popen (test code inside) · Issue #6429 · matplotlib/matplotlib · GitHub
Skip to content

Segfault when calling show() after using Popen (test code inside) #6429

Description

@cmey

Hi, please consider the following SSCCE:

import matplotlib
matplotlib.use('MacOSX')  # Segfault in backend from call to pyplot.show().
# matplotlib.use('TkAgg')  # This backend does not reproduce the segfault.
import matplotlib.pyplot as plt
import numpy as np
import signal
from subprocess import Popen, PIPE

def mplayer_view(img):
    mplayer = Popen(
        ['mplayer', '-',
         '-demuxer', 'rawvideo',
         '-rawvideo', 'w={}:h={}:format={}'.format(
            img.shape[1], img.shape[0], 'y8')],
        stdin=PIPE
    )

    tmp = img.astype('int8').tostring('C')

    # Writing twice is important to reproduce the segfault (no flush needed).
    mplayer.stdin.write(tmp)
    mplayer.stdin.write(tmp)

    mplayer.kill()

if __name__ == "__main__":
    img = np.zeros((512,512))  # Need to write enough bytes.
    mplayer_view(img)

    plt.figure()
    plt.show()  # <-- segfault here

Running that with python I get Segmentation fault: 11

Using faulthandler, the backtrace traces it to matplotlib's macosx backend from the call to show():

Fatal Python error: Segmentation fault

Current thread 0x00007fff7a0c4000 (most recent call first):
  File "/Users/cmey/.pyenv/versions/chips-3.4.3/lib/python3.4/site-packages/matplotlib/backends/backend_macosx.py", line 29 in mainloop
  File "/Users/cmey/.pyenv/versions/chips-3.4.3/lib/python3.4/site-packages/matplotlib/backend_bases.py", line 192 in __call__
  File "/Users/cmey/.pyenv/versions/chips-3.4.3/lib/python3.4/site-packages/matplotlib/pyplot.py", line 244 in show
  File "/Users/cmey/Code/python/test_matplotlib_segfault.py", line 35 in <module>
Segmentation fault: 11

I checked the return code from mplayer (with mplayer.wait()), it is -9 as it should (I kill it). If it was mplayer that segfaulted, wait() would return -11. Even if mplayer segfaults, that should not produce a segfault from matplotlib/Python.

I couldn't find another program than mplayer to pipe to, that reproduces the segfault.

Christophe
-- OSX, matplotlib version 1.5.1 from pip 8.1.2, Python 3.4.3 from pyenv, MPlayer 1.3.0-4.2.1

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions