From b649703d1a5da7a539bdb65825ef6c321fa1d72a Mon Sep 17 00:00:00 2001 From: Michal Vasilek Date: Tue, 28 Sep 2021 20:30:31 +0200 Subject: [PATCH 1/2] pulseaudio: fix segfault when listing handlers PulseAudio segfaulted when asserts were disabled and an application tried to list handlers: pactl send-message /core list-handlers This was bug was triggered with the pavucontrol 5.0 update. https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1278 --- ...ession-with-side-effect-in-pa_assert.patch | 79 +++++++++++++++++++ srcpkgs/pulseaudio/template | 2 +- 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/pulseaudio/patches/fix-expression-with-side-effect-in-pa_assert.patch diff --git a/srcpkgs/pulseaudio/patches/fix-expression-with-side-effect-in-pa_assert.patch b/srcpkgs/pulseaudio/patches/fix-expression-with-side-effect-in-pa_assert.patch new file mode 100644 index 000000000000..eff6b1c1406c --- /dev/null +++ b/srcpkgs/pulseaudio/patches/fix-expression-with-side-effect-in-pa_assert.patch @@ -0,0 +1,79 @@ +From e1899245703f1dfa3220af465046c287a5f1c2ba Mon Sep 17 00:00:00 2001 +From: "Igor V. Kovalenko" +Date: Thu, 30 Sep 2021 08:40:35 +0300 +Subject: [PATCH] Fix expression with side effect in pa_assert + +Part-of: +--- + src/modules/bluetooth/module-bluez5-device.c | 4 ++-- + src/pulsecore/card.c | 4 ++-- + src/pulsecore/core.c | 4 ++-- + src/pulsecore/dbus-util.c | 2 +- + 4 files changed, 7 insertions(+), 7 deletions(-) + +diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c +index 9774be5cc..afbb7e3fa 100644 +--- a/src/modules/bluetooth/module-bluez5-device.c ++++ b/src/modules/bluetooth/module-bluez5-device.c +@@ -2513,10 +2513,10 @@ static int bluez5_device_message_handler(const char *object_path, const char *me + pa_bluetooth_profile_t profile; + const pa_a2dp_endpoint_conf *endpoint_conf; + const char *codec_name; +- struct userdata *u; ++ struct userdata *u = userdata; + bool is_a2dp_sink; + +- pa_assert(u = (struct userdata *)userdata); ++ pa_assert(u); + pa_assert(message); + pa_assert(response); + +diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c +index 23b347b59..4f5997d2c 100644 +--- a/src/pulsecore/card.c ++++ b/src/pulsecore/card.c +@@ -467,10 +467,10 @@ int pa_card_suspend(pa_card *c, bool suspend, pa_suspend_cause_t cause) { + } + + static int card_message_handler(const char *object_path, const char *message, const pa_json_object *parameters, char **response, void *userdata) { +- pa_card *c; ++ pa_card *c = userdata; + char *message_handler_path; + +- pa_assert(c = (pa_card *) userdata); ++ pa_assert(c); + pa_assert(message); + pa_assert(response); + +diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c +index 174d0650e..132f08bbb 100644 +--- a/src/pulsecore/core.c ++++ b/src/pulsecore/core.c +@@ -86,9 +86,9 @@ static char *message_handler_list(pa_core *c) { + } + + static int core_message_handler(const char *object_path, const char *message, const pa_json_object *parameters, char **response, void *userdata) { +- pa_core *c; ++ pa_core *c = userdata; + +- pa_assert(c = (pa_core *) userdata); ++ pa_assert(c); + pa_assert(message); + pa_assert(response); + pa_assert(pa_safe_streq(object_path, "/core")); +diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c +index 7d550204e..466a882d8 100644 +--- a/src/pulsecore/dbus-util.c ++++ b/src/pulsecore/dbus-util.c +@@ -737,7 +737,7 @@ pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusM + pa_assert(msg); + pa_assert(iter); + +- pa_assert(signature = dbus_message_iter_get_signature(iter)); ++ pa_assert_se(signature = dbus_message_iter_get_signature(iter)); + pa_assert_se(pa_streq(signature, "a{say}")); + + dbus_free(signature); +-- +GitLab + diff --git a/srcpkgs/pulseaudio/template b/srcpkgs/pulseaudio/template index f1f88d7fb08a..685154e8c0e1 100644 --- a/srcpkgs/pulseaudio/template +++ b/srcpkgs/pulseaudio/template @@ -1,7 +1,7 @@ # Template file for 'pulseaudio' pkgname=pulseaudio version=15.0 -revision=2 +revision=3 build_style=meson configure_args="-Djack=enabled -Dlirc=disabled -Dhal-compat=false -Dorc=enabled -Dgtk=disabled -Dsystemd=disabled -Dwebrtc-aec=enabled From 74b3de8754a38f5e1a7680c3d4ac5a85b0983464 Mon Sep 17 00:00:00 2001 From: Michal Vasilek Date: Tue, 28 Sep 2021 20:33:20 +0200 Subject: [PATCH 2/2] pavucontrol: update to 5.0. This update was previously reverted because it was segfaulting pulseaudio, but this has been fixed. --- .../pavucontrol/patches/fix-segfault.patch | 319 ------------------ srcpkgs/pavucontrol/template | 12 +- 2 files changed, 6 insertions(+), 325 deletions(-) delete mode 100644 srcpkgs/pavucontrol/patches/fix-segfault.patch diff --git a/srcpkgs/pavucontrol/patches/fix-segfault.patch b/srcpkgs/pavucontrol/patches/fix-segfault.patch deleted file mode 100644 index fe7fcba5ccc7..000000000000 --- a/srcpkgs/pavucontrol/patches/fix-segfault.patch +++ /dev/null @@ -1,319 +0,0 @@ -Upstream: yes, not released. - -Remove configure.ac changes to avoid need to reconfigure. -We know we have the necessary version of its dependencies. - -From 284082551938b65e71d06bda793fedbd4a4f41ab Mon Sep 17 00:00:00 2001 -From: Felipe Sateler -Date: Sat, 28 Dec 2019 12:39:38 -0300 -Subject: [PATCH] Migrate away from deprecated Gtk interfaces - -This was accomplished by building with -DGTKMM_DISABLE_DEPRECATED. ---- - configure.ac | 2 +- - src/channelwidget.h | 2 +- - src/devicewidget.cc | 6 +++--- - src/mainwindow.cc | 12 ++++++------ - src/pavuapplication.cc | 22 +++++++++++++++------- - src/pavuapplication.h | 2 ++ - src/pavucontrol.cc | 7 ++++--- - src/pavucontrol.glade | 24 ++++++++++++------------ - src/sinkwidget.h | 2 +- - src/streamwidget.cc | 2 +- - 10 files changed, 46 insertions(+), 35 deletions(-) - -diff --git a/src/channelwidget.h b/src/channelwidget.h -index c9c5c9d..6216b74 100644 ---- a/src/channelwidget.h -+++ b/src/channelwidget.h -@@ -38,7 +38,7 @@ public: - - Gtk::Label *channelLabel; - Gtk::Label *volumeLabel; -- Gtk::HScale *volumeScale; -+ Gtk::Scale *volumeScale; - - int channel; - MinimalStreamWidget *minimalStreamWidget; -diff --git a/src/devicewidget.cc b/src/devicewidget.cc -index e1b1869..dd41487 100644 ---- a/src/devicewidget.cc -+++ b/src/devicewidget.cc -@@ -227,7 +227,7 @@ void DeviceWidget::prepareMenu() { - - bool DeviceWidget::onContextTriggerEvent(GdkEventButton* event) { - if (GDK_BUTTON_PRESS == event->type && 3 == event->button) { -- contextMenu.popup(event->button, event->time); -+ contextMenu.popup_at_pointer((GdkEvent*)event); - return true; - } - -@@ -259,8 +259,8 @@ void DeviceWidget::renamePopup() { - x->get_widget("renameText", renameText); - - renameText->set_text(description); -- dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); -- dialog->add_button(Gtk::Stock::OK, Gtk::RESPONSE_OK); -+ dialog->add_button("_Cancel", Gtk::RESPONSE_CANCEL); -+ dialog->add_button("_OK", Gtk::RESPONSE_OK); - dialog->set_default_response(Gtk::RESPONSE_OK); - if (Gtk::RESPONSE_OK == dialog->run()) { - pa_operation* o; -diff --git a/src/mainwindow.cc b/src/mainwindow.cc -index f3d8620..e1a0a82 100644 ---- a/src/mainwindow.cc -+++ b/src/mainwindow.cc -@@ -95,11 +95,11 @@ MainWindow::MainWindow(BaseObjectType* cobject, const Glib::RefPtr - x->get_widget("notebook", notebook); - x->get_widget("showVolumeMetersCheckButton", showVolumeMetersCheckButton); - -- cardsVBox->set_reallocate_redraws(true); -- sourcesVBox->set_reallocate_redraws(true); -- streamsVBox->set_reallocate_redraws(true); -- recsVBox->set_reallocate_redraws(true); -- sinksVBox->set_reallocate_redraws(true); -+ sourcesVBox->signal_size_allocate().connect([this](Gdk::Rectangle _unused){ sourcesVBox->queue_draw(); }); -+ cardsVBox->signal_size_allocate().connect([this](Gdk::Rectangle _unused){ cardsVBox->queue_draw(); }); -+ streamsVBox->signal_size_allocate().connect([this](Gdk::Rectangle _unused){ streamsVBox->queue_draw(); }); -+ recsVBox->signal_size_allocate().connect([this](Gdk::Rectangle _unused){ recsVBox->queue_draw(); }); -+ sinksVBox->signal_size_allocate().connect([this](Gdk::Rectangle _unused){ sinksVBox->queue_draw(); }); - - sinkInputTypeComboBox->set_active((int) showSinkInputType); - sourceOutputTypeComboBox->set_active((int) showSourceOutputType); -@@ -222,7 +222,7 @@ bool MainWindow::on_key_press_event(GdkEventKey* event) { - case GDK_KEY_Q: - case GDK_KEY_w: - case GDK_KEY_q: -- Gtk::Main::quit(); -+ this->get_application()->quit(); - return true; - } - } -diff --git a/src/pavuapplication.cc b/src/pavuapplication.cc -index 2ff5739..6773b53 100644 ---- a/src/pavuapplication.cc -+++ b/src/pavuapplication.cc -@@ -30,6 +30,14 @@ - #include "pavucontrol.h" - #include "mainwindow.h" - -+static PavuApplication globalInstance; -+ -+PavuApplication& -+PavuApplication::get_instance() -+{ -+ return globalInstance; -+} -+ - PavuApplication::PavuApplication() : - Gtk::Application("org.pulseaudio.pavucontrol", Gio::ApplicationFlags::APPLICATION_HANDLES_COMMAND_LINE), - mainWindow(NULL), -@@ -143,26 +151,26 @@ int main(int argc, char *argv[]) { - signal(SIGPIPE, SIG_IGN); - - /* Create the application */ -- auto app = PavuApplication(); -+ globalInstance = PavuApplication(); - - /* Add command-line options */ -- app.add_main_option_entry( -+ globalInstance.add_main_option_entry( - Gio::Application::OptionType::OPTION_TYPE_INT, - "tab", 't', - _("Select a specific tab on load."), - _("number")); - -- app.add_main_option_entry( -+ globalInstance.add_main_option_entry( - Gio::Application::OptionType::OPTION_TYPE_BOOL, - "retry", 'r', - _("Retry forever if pa quits (every 5 seconds).")); - -- app.add_main_option_entry( -+ globalInstance.add_main_option_entry( - Gio::Application::OptionType::OPTION_TYPE_BOOL, - "maximize", 'm', - _("Maximize the window.")); - -- app.add_main_option_entry( -+ globalInstance.add_main_option_entry( - Gio::Application::OptionType::OPTION_TYPE_BOOL, - "version", 'v', - _("Show version.")); -@@ -170,7 +178,7 @@ int main(int argc, char *argv[]) { - /* Connect to the "on_command_line" signal which is fired - * when the application receives command-line arguments - */ -- app.signal_command_line().connect(sigc::bind(sigc::ptr_fun(&on_command_line), &app), false); -+ globalInstance.signal_command_line().connect(sigc::bind(sigc::ptr_fun(&on_command_line), &globalInstance), false); - - /* Run the application. - * In the first launched instance, this will return when its window is -@@ -179,5 +187,5 @@ int main(int argc, char *argv[]) { - * Handling a new request consists of presenting the existing window (and - * optionally, select a tab). - */ -- return app.run(argc, argv); -+ return globalInstance.run(argc, argv); - } -diff --git a/src/pavuapplication.h b/src/pavuapplication.h -index 3589c5d..d2a1f5a 100644 ---- a/src/pavuapplication.h -+++ b/src/pavuapplication.h -@@ -37,6 +37,8 @@ public: - gint32 tab; - bool version; - -+ static PavuApplication& get_instance(); -+ - protected: - // Override default signal handlers: - void on_activate() override; -diff --git a/src/pavucontrol.cc b/src/pavucontrol.cc -index 6981707..bcdde8e 100644 ---- a/src/pavucontrol.cc -+++ b/src/pavucontrol.cc -@@ -40,6 +40,7 @@ - #include "sourceoutputwidget.h" - #include "rolewidget.h" - #include "mainwindow.h" -+#include "pavuapplication.h" - - static pa_context* context = NULL; - static pa_mainloop_api* api = NULL; -@@ -56,7 +57,7 @@ void show_error(const char *txt) { - Gtk::MessageDialog dialog(buf, false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_CLOSE, true); - dialog.run(); - -- Gtk::Main::quit(); -+ PavuApplication::get_instance().quit(); - } - - static void dec_outstanding(MainWindow *w) { -@@ -571,7 +572,7 @@ void context_state_callback(pa_context *c, void *userdata) { - - case PA_CONTEXT_TERMINATED: - default: -- Gtk::Main::quit(); -+ w->get_application()->quit(); - return; - } - } -@@ -613,7 +614,7 @@ gboolean connect_to_pulse(gpointer userdata) { - else { - if(!retry) { - reconnect_timeout = -1; -- Gtk::Main::quit(); -+ w->get_application()->quit(); - } else { - g_debug(_("Connection failed, attempting reconnect")); - reconnect_timeout = 5; -diff --git a/src/pavucontrol.glade b/src/pavucontrol.glade -index e26e0c4..ed83b04 100644 ---- a/src/pavucontrol.glade -+++ b/src/pavucontrol.glade -@@ -425,10 +425,10 @@ - True - False - -- -+ - False -- 2 -- 3 -+ True -+ True - - - PCM -@@ -439,6 +439,10 @@ - True - True - -+ -+ 0 -+ 0 -+ - - - -@@ -450,7 +454,7 @@ - - - 1 -- 2 -+ 0 - - - -@@ -462,8 +466,8 @@ - True - - -- 1 -- 2 -+ 2 -+ 0 - - - -@@ -475,8 +479,8 @@ - True - - -- 2 -- 3 -+ 0 -+ 1 - - - -@@ -489,9 +493,7 @@ - - - 1 -- 2 - 1 -- 2 - - - -@@ -504,9 +506,7 @@ - - - 2 -- 3 - 1 -- 2 - - - -diff --git a/src/sinkwidget.h b/src/sinkwidget.h -index 0044ffc..924fca0 100644 ---- a/src/sinkwidget.h -+++ b/src/sinkwidget.h -@@ -46,7 +46,7 @@ public: - - #if HAVE_EXT_DEVICE_RESTORE_API - encodingList encodings[PAVU_NUM_ENCODINGS]; -- Gtk::Table *encodingSelect; -+ Gtk::Grid *encodingSelect; - #endif - - virtual void onMuteToggleButton(); -diff --git a/src/streamwidget.cc b/src/streamwidget.cc -index 00df09f..d203b20 100644 ---- a/src/streamwidget.cc -+++ b/src/streamwidget.cc -@@ -66,7 +66,7 @@ void StreamWidget::init(MainWindow* mainWindow) { - - bool StreamWidget::onContextTriggerEvent(GdkEventButton* event) { - if (GDK_BUTTON_PRESS == event->type && 3 == event->button) { -- contextMenu.popup(event->button, event->time); -+ contextMenu.popup_at_pointer((GdkEvent*)event); - return true; - } - return false; --- -GitLab - diff --git a/srcpkgs/pavucontrol/template b/srcpkgs/pavucontrol/template index 45e93d9b130a..dfd14580be52 100644 --- a/srcpkgs/pavucontrol/template +++ b/srcpkgs/pavucontrol/template @@ -1,14 +1,14 @@ # Template file for 'pavucontrol' pkgname=pavucontrol -reverts="5.0_1" -version=4.0 -revision=3 +version=5.0 +revision=2 build_style=gnu-configure hostmakedepends="pkg-config intltool" -makedepends="gtkmm-devel libcanberra-devel gtk+3-devel pulseaudio-devel" +makedepends="gtkmm-devel libcanberra-devel gtk+3-devel pulseaudio-devel + json-glib-devel" short_desc="PulseAudio Volume Control" maintainer="Orphaned " license="GPL-2.0-or-later" homepage="https://freedesktop.org/software/pulseaudio/pavucontrol/" -distfiles="${homepage}/${pkgname}-${version}.tar.xz" -checksum=8fc45bac9722aefa6f022999cbb76242d143c31b314e2dbb38f034f4069d14e2 +distfiles="${FREEDESKTOP_SITE}/pulseaudio/pavucontrol/pavucontrol-${version}.tar.xz" +checksum=ce2b72c3b5f1a70ad0df19dd81750f9455bd20870d1d3a36d20536af2e8f4e7a