Bug 81116 - pavucontrol crash at MainWindow::updateCard (this=0x8264400, info=...) at mainwindow.cc:319
Summary: pavucontrol crash at MainWindow::updateCard (this=0x8264400, info=...) at mai...
Status: RESOLVED NOTOURBUG
Alias: None
Product: PulseAudio
Classification: Unclassified
Component: pavucontrol (show other bugs)
Version: unspecified
Hardware: Other All
: medium normal
Assignee: pulseaudio-bugs
QA Contact: pulseaudio-bugs
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2014-07-09 15:59 UTC by Rex Dieter
Modified: 2014-07-16 12:30 UTC (History)
3 users (show)

See Also:
i915 platform:
i915 features:


Attachments

Description Rex Dieter 2014-07-09 15:59:13 UTC
Since upgrade to pulseaudio-5.0, there seem to be cases where card profile struct isn't fully initialized (name field particularly), so experience crashes in applications that don't handle this.

Examples include: gnome-settings-daemon, gnome-shell ( see http://bugzilla.gnome.org/732952 ) and pavucontrol (here).

(gdb) backtrace
#0  __strcmp_sse4_2 () at ../sysdeps/i386/i686/multiarch/strcmp-sse4.S:217
#1  0x0806ea50 in operator() (this=0xbfffe8e8, lhs=..., lhs=..., rhs=..., rhs=...) at mainwindow.cc:43
#2  _M_get_insert_unique_pos (__k=..., this=0xbfffe8e8) at /usr/include/c++/4.8.2/bits/stl_tree.h:1324
#3  std::_Rb_tree<pa_card_profile_info, pa_card_profile_info, std::_Identity<pa_card_profile_info>, profile_prio_compare, std::allocator<pa_card_profile_info> >::_M_insert_unique (this=0xbfffe8e8, __v=...) at /usr/include/c++/4.8.2/bits/stl_tree.h:1377
#4  0x0806a5cd in insert (__x=..., this=0xbfffe8e8) at /usr/include/c++/4.8.2/bits/stl_set.h:463
#5  MainWindow::updateCard (this=0x8264400, info=...) at mainwindow.cc:319
#6  0xb6c9f06a in context_get_card_info_callback (pd=pd@entry=0x8218b20, command=command@entry=2, tag=tag@entry=5, t=t@entry=0x82c7cc8, 
    userdata=userdata@entry=0x82cb8c8) at pulse/introspect.c:971
#7  0xb64618b0 in run_action (pd=0x8218b20, r=0x82cb9a0, command=2, ts=0x82c7cc8) at pulsecore/pdispatch.c:279
#8  0xb6461cd0 in pa_pdispatch_run (pd=0x8218b20, packet=packet@entry=0x82cd6f0, creds=creds@entry=0x82841a8, 
    userdata=userdata@entry=0x825c430) at pulsecore/pdispatch.c:331
#9  0xb6c909c5 in pstream_packet_callback (p=p@entry=0x8284000, packet=0x82cd6f0, creds=0x82841a8, userdata=userdata@entry=0x825c430)
    at pulse/context.c:335
#10 0xb646686b in do_read (p=0x8284000) at pulsecore/pstream.c:830
#11 do_pstream_read_write (p=0x8284000) at pulsecore/pstream.c:185
#12 0xb6451230 in callback (m=m@entry=0x826d734, e=e@entry=0x82cb898, fd=9, f=PA_IO_EVENT_INPUT, userdata=0x80d6068)
    at pulsecore/iochannel.c:160
#13 0xb6cd6adf in dispatch_func (source=source@entry=0x826d700, callback=0x0, userdata=0x0) at pulse/glib-mainloop.c:586
#14 0xb6d23556 in g_main_dispatch (context=0x80d6200) at gmain.c:3066
#15 g_main_context_dispatch (context=context@entry=0x80d6200) at gmain.c:3642
#16 0xb6d23920 in g_main_context_iterate (context=0x80d6200, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>)
    at gmain.c:3713
#17 0xb6d23dc3 in g_main_loop_run (loop=loop@entry=0x8218ac8) at gmain.c:3907
#18 0xb74246dd in gtk_main () at gtkmain.c:1158
#19 0xb7deba05 in Gtk::Main::run_impl (this=0xbfffee1c) at main.cc:440
#20 0xb7dec03b in Gtk::Main::run (window=...) at main.cc:399
#21 0x08053e18 in main (argc=1, argv=0xbfffef34) at pavucontrol.cc:683
Comment 1 Rex Dieter 2014-07-09 15:59:38 UTC
$ rpm -q pulseaudio pavucontrol
pulseaudio-5.0-6.fc20.i686
pavucontrol-2.0-4.fc20.i686
Comment 2 Rex Dieter 2014-07-09 16:20:46 UTC
$ pactl info
Server String: unix:/run/user/1482/pulse/native
Library Protocol Version: 29
Server Protocol Version: 29
Is Local: yes
Client Index: 17
Tile Size: 65496
User Name: rdieter1
Host Name: math-171.unl.edu
Server Name: pulseaudio
Server Version: 5.0
Default Sample Specification: s16le 2ch 44100Hz
Default Channel Map: front-left,front-right
Default Sink: alsa_output.pci-0000_00_1b.0.analog-stereo
Default Source: alsa_input.pci-0000_00_1b.0.analog-stereo
Cookie: 5f51:4518

$ pactl list
...

Card #0
        Name: alsa_card.pci-0000_00_1b.0
        Driver: module-alsa-card.c
        Owner Module: 6
        Properties:
                alsa.card = "0"
                alsa.card_name = "HDA Intel PCH"
                alsa.long_card_name = "HDA Intel PCH at 0xf7c30000 irq 45"
                alsa.driver_name = "snd_hda_intel"
                device.bus_path = "pci-0000:00:1b.0"
                sysfs.path = "/devices/pci0000:00/0000:00:1b.0/sound/card0"
                device.bus = "pci"
                device.vendor.id = "8086"
                device.vendor.name = "Intel Corporation"
                device.product.id = "1e20"
                device.product.name = "7 Series/C210 Series Chipset Family High Definition Audio Controller"
                device.form_factor = "internal"
                device.string = "0"
                device.description = "Built-in Audio"
                module-udev-detect.discovered = "1"
                device.icon_name = "audio-card-pci"
        Profiles:
                input:analog-stereo: Analog Stereo Input (sinks: 0, sources: 1, priority: 60, available: yes)
                output:analog-stereo: Analog Stereo Output (sinks: 1, sources: 0, priority: 6000, available: yes)
                output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (sinks: 1, sources: 1, priority: 6060, available: yes)
                output:hdmi-stereo: Digital Stereo (HDMI) Output (sinks: 1, sources: 0, priority: 5400, available: yes)
                output:hdmi-stereo+input:analog-stereo: Digital Stereo (HDMI) Output + Analog Stereo Input (sinks: 1, sources: 1, priority: 5460, available: yes)
                output:hdmi-surround: Digital Surround 5.1 (HDMI) Output (sinks: 1, sources: 0, priority: 300, available: yes)
                output:hdmi-surround+input:analog-stereo: Digital Surround 5.1 (HDMI) Output + Analog Stereo Input (sinks: 1, sources: 1, priority: 360, available: yes)
                output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (sinks: 1, sources: 0, priority: 5200, available: yes)
                output:hdmi-stereo-extra1+input:analog-stereo: Digital Stereo (HDMI 2) Output + Analog Stereo Input (sinks: 1, sources: 1, priority: 5260, available: yes)
                output:hdmi-surround-extra1: Digital Surround 5.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes)
                output:hdmi-surround-extra1+input:analog-stereo: Digital Surround 5.1 (HDMI 2) Output + Analog Stereo Input (sinks: 1, sources: 1, priority: 160, available: yes)
                off: Off (sinks: 0, sources: 0, priority: 0, available: yes)
        Active Profile: output:analog-stereo+input:analog-stereo
        Ports:
                analog-input-front-mic: Front Microphone (priority: 8500, latency offset: 0 usec, not available)
                        Properties:
                                device.icon_name = "audio-input-microphone"
                        Part of profile(s): input:analog-stereo, output:analog-stereo+input:analog-stereo, output:hdmi-stereo+input:analog-stereo, output:hdmi-surround+input:analog-stereo, output:hdmi-stereo-extra1+input:analog-stereo, output:hdmi-surround-extra1+input:analog-stereo
                analog-input-rear-mic: Rear Microphone (priority: 8200, latency offset: 0 usec, not available)
                        Properties:
                                device.icon_name = "audio-input-microphone"
                        Part of profile(s): input:analog-stereo, output:analog-stereo+input:analog-stereo, output:hdmi-stereo+input:analog-stereo, output:hdmi-surround+input:analog-stereo, output:hdmi-stereo-extra1+input:analog-stereo, output:hdmi-surround-extra1+input:analog-stereo
                analog-output: Analog Output (priority: 9900, latency offset: 0 usec)
                        Part of profile(s): output:analog-stereo, output:analog-stereo+input:analog-stereo
                analog-output-lineout: Line Out (priority: 9900, latency offset: 0 usec, not available)
                        Part of profile(s): output:analog-stereo, output:analog-stereo+input:analog-stereo
                analog-output-speaker: Speakers (priority: 10000, latency offset: 0 usec)
                        Properties:
                                device.icon_name = "audio-speakers"
                        Part of profile(s): output:analog-stereo, output:analog-stereo+input:analog-stereo
                analog-output-headphones: Headphones (priority: 9000, latency offset: 0 usec, not available)
                        Properties:
                                device.icon_name = "audio-headphones"
                        Part of profile(s): output:analog-stereo, output:analog-stereo+input:analog-stereo
                hdmi-output-0: HDMI / DisplayPort (priority: 5900, latency offset: 0 usec, not available)
                        Properties:
                                device.icon_name = "video-display"
                        Part of profile(s): output:hdmi-stereo, output:hdmi-stereo+input:analog-stereo, output:hdmi-surround, output:hdmi-surround+input:analog-stereo
                hdmi-output-1: HDMI / DisplayPort 2 (priority: 5800, latency offset: 0 usec, not available)
                        Properties:
                                device.icon_name = "video-display"
                        Part of profile(s): output:hdmi-stereo-extra1, output:hdmi-stereo-extra1+input:analog-stereo, output:hdmi-surround-extra1, output:hdmi-surround-extra1+input:analog-stereo
Comment 3 Rex Dieter 2014-07-09 16:56:58 UTC
Confirmed problem remains testing against pulseaudio master branch as of today.
Comment 4 Rex Dieter 2014-07-09 18:48:52 UTC
For posterity, adding comment from Tanu about how best to debug this further from onlist:

The comment in the Gnome bug is correct: PulseAudio should be fixed to
never set card profile names to NULL.

How to debug: first see the code in src/pulse/introspect.c and figure
out how it could pass NULL names to applications. Even if the server
sends NULL names, libpulse should handle that by closing the connection
due to protocol error, and not pass the NULL names to applications. I
see that both fill_card_port_info() fill_card_profile_info() have
insufficient input validation regarding profile names. If you fix that,
and the result is that now clients get disconnected due to bad data from
the server, the next step is to add assertions about NULL names to the
server code (src/pulsecore/protocol-native.c) to the places where
profile names are sent to clients. The assertions should cause the
server to crash, and hopefully the backtraces from those crashes can
point to the root cause of the problem.
Comment 5 Rex Dieter 2014-07-11 13:14:00 UTC
I found one possible cause, between the 4.0 snapshot fedora 20 shipped with (f81e3) and pulseaudio-5.0, came this ABI break(1):

http://cgit.freedesktop.org/pulseaudio/pulseaudio/commit/?id=85e7fbc196f4424f68e530c2e3a01d9b941f293e

I'll try to do more testing over the next day or 2 to confirm this suspicion.  If positive, yuck, will have to think deeply on how best to handle fixing it downstream.


1. strictly speaking, it was fixing/restoring a prior break introduced in 4.0 development
Comment 6 Tanu Kaskinen 2014-07-11 13:31:24 UTC
That sounds quite likely explanation for the pavucontrol crash. IIRC Mageia had the same problem. To fix the problem (or to confirm that it's a different issue after all) you just need to rebuild everything that depends on libpulse - is that hard to do in Fedora?
Comment 7 Rex Dieter 2014-07-11 13:37:05 UTC
rebuilding everything hard?  no, just annoying and tedious... but will likely be the least bad way forward.
Comment 8 Rex Dieter 2014-07-16 12:30:38 UTC
Confirmed downstream issue only, rebuilt pavucontrol behaves better.


Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.