[Git][pulseaudio/pulseaudio][master] alsa-ucm: Check UCM verb before working with device status

PulseAudio Marge Bot (@pulseaudio-merge-bot) gitlab at gitlab.freedesktop.org
Fri Jan 12 19:57:35 UTC 2024



PulseAudio Marge Bot pushed to branch master at PulseAudio / pulseaudio


Commits:
f5cacd94 by Alper Nebi Yasak at 2024-01-12T19:54:29+00:00
alsa-ucm: Check UCM verb before working with device status

Some versions of the ALSA libraries run into a segmentation fault when
we query a UCM device/modifier status without first setting a UCM verb.
It's not a reasonable thing to do anyway, so check for this case and
return an error. Also do the check in other helpers.

Signed-off-by: Alper Nebi Yasak <alpernebiyasak at gmail.com>
Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/801>

- - - - -


1 changed file:

- src/modules/alsa/alsa-ucm.c


Changes:

=====================================
src/modules/alsa/alsa-ucm.c
=====================================
@@ -624,6 +624,11 @@ static long ucm_device_status(pa_alsa_ucm_config *ucm, pa_alsa_ucm_device *dev)
     char *devstatus;
     long status = 0;
 
+    if (!ucm->active_verb) {
+        pa_log_error("Failed to get status for UCM device %s: no UCM verb set", dev_name);
+        return -1;
+    }
+
     devstatus = pa_sprintf_malloc("_devstatus/%s", dev_name);
     if (snd_use_case_geti(ucm->ucm_mgr, devstatus, &status) < 0) {
         pa_log_debug("Failed to get status for UCM device %s", dev_name);
@@ -637,6 +642,11 @@ static long ucm_device_status(pa_alsa_ucm_config *ucm, pa_alsa_ucm_device *dev)
 static int ucm_device_disable(pa_alsa_ucm_config *ucm, pa_alsa_ucm_device *dev) {
     const char *dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME);
 
+    if (!ucm->active_verb) {
+        pa_log_error("Failed to disable UCM device %s: no UCM verb set", dev_name);
+        return -1;
+    }
+
     /* If any of dev's conflicting devices is enabled, trying to disable
      * dev gives an error despite the fact that it's already disabled.
      * Check that dev is enabled to avoid this error. */
@@ -657,6 +667,11 @@ static int ucm_device_disable(pa_alsa_ucm_config *ucm, pa_alsa_ucm_device *dev)
 static int ucm_device_enable(pa_alsa_ucm_config *ucm, pa_alsa_ucm_device *dev) {
     const char *dev_name = pa_proplist_gets(dev->proplist, PA_ALSA_PROP_UCM_NAME);
 
+    if (!ucm->active_verb) {
+        pa_log_error("Failed to enable UCM device %s: no UCM verb set", dev_name);
+        return -1;
+    }
+
     /* We don't need to enable devices that are already enabled */
     if (ucm_device_status(ucm, dev) > 0) {
         pa_log_debug("UCM device %s is already enabled", dev_name);
@@ -707,6 +722,11 @@ static long ucm_modifier_status(pa_alsa_ucm_config *ucm, pa_alsa_ucm_modifier *m
     char *modstatus;
     long status = 0;
 
+    if (!ucm->active_verb) {
+        pa_log_error("Failed to get status for UCM modifier %s: no UCM verb set", mod_name);
+        return -1;
+    }
+
     modstatus = pa_sprintf_malloc("_modstatus/%s", mod_name);
     if (snd_use_case_geti(ucm->ucm_mgr, modstatus, &status) < 0) {
         pa_log_debug("Failed to get status for UCM modifier %s", mod_name);
@@ -720,6 +740,11 @@ static long ucm_modifier_status(pa_alsa_ucm_config *ucm, pa_alsa_ucm_modifier *m
 static int ucm_modifier_disable(pa_alsa_ucm_config *ucm, pa_alsa_ucm_modifier *mod) {
     const char *mod_name = pa_proplist_gets(mod->proplist, PA_ALSA_PROP_UCM_NAME);
 
+    if (!ucm->active_verb) {
+        pa_log_error("Failed to disable UCM modifier %s: no UCM verb set", mod_name);
+        return -1;
+    }
+
     /* We don't need to disable modifiers that are already disabled */
     if (ucm_modifier_status(ucm, mod) == 0) {
         pa_log_debug("UCM modifier %s is already disabled", mod_name);
@@ -738,6 +763,11 @@ static int ucm_modifier_disable(pa_alsa_ucm_config *ucm, pa_alsa_ucm_modifier *m
 static int ucm_modifier_enable(pa_alsa_ucm_config *ucm, pa_alsa_ucm_modifier *mod) {
     const char *mod_name = pa_proplist_gets(mod->proplist, PA_ALSA_PROP_UCM_NAME);
 
+    if (!ucm->active_verb) {
+        pa_log_error("Failed to disable UCM modifier %s: no UCM verb set", mod_name);
+        return -1;
+    }
+
     /* We don't need to enable modifiers that are already enabled */
     if (ucm_modifier_status(ucm, mod) > 0) {
         pa_log_debug("UCM modifier %s is already enabled", mod_name);



View it on GitLab: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commit/f5cacd94abcc47003bd88ad7ca1450de649ffb15

-- 
View it on GitLab: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/commit/f5cacd94abcc47003bd88ad7ca1450de649ffb15
You're receiving this email because of your account on gitlab.freedesktop.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/pulseaudio-commits/attachments/20240112/b87b1e4c/attachment-0001.htm>


More information about the pulseaudio-commits mailing list