Merge branch 'alsa-ucm-fix-infinite-recursion' into 'master'

alsa-ucm: Fix segfault from recursion due to too many devices

See merge request pulseaudio/pulseaudio!838
This commit is contained in:
Alper Nebi Yasak 2025-10-08 06:02:34 +03:00
commit 0a25cfb533

View file

@ -1404,22 +1404,20 @@ static pa_idxset *iterate_device_subsets(pa_idxset *devices, void **state) {
static pa_idxset *iterate_maximal_device_subsets(pa_idxset *devices, void **state) { static pa_idxset *iterate_maximal_device_subsets(pa_idxset *devices, void **state) {
uint32_t idx; uint32_t idx;
pa_alsa_ucm_device *dev; pa_alsa_ucm_device *dev;
pa_idxset *subset; pa_idxset *subset = NULL;
pa_assert(devices); pa_assert(devices);
pa_assert(state); pa_assert(state);
subset = iterate_device_subsets(devices, state); while (subset == NULL && (subset = iterate_device_subsets(devices, state))) {
if (!subset) /* Skip this group if it's incomplete, by checking if we can add any
return subset; * other device. If we can, this iteration is a subset of another
* group that we already returned or eventually return. */
/* Skip this group if it's incomplete, by checking if we can add any PA_IDXSET_FOREACH(dev, devices, idx) {
* other device. If we can, this iteration is a subset of another if (subset && !pa_idxset_contains(subset, dev) && devset_supports_device(subset, dev)) {
* group that we already returned or eventually return. */ pa_idxset_free(subset, NULL);
PA_IDXSET_FOREACH(dev, devices, idx) { subset = NULL;
if (!pa_idxset_contains(subset, dev) && devset_supports_device(subset, dev)) { }
pa_idxset_free(subset, NULL);
return iterate_maximal_device_subsets(devices, state);
} }
} }