Hi João, On Tue, Jun 29, 2021 at 4:52 PM João Paulo Rechi Vita <jprvita@xxxxxxxxx> wrote: > > On Thu, Jun 10, 2021 at 7:07 PM João Paulo Rechi Vita <jprvita@xxxxxxxxx> wrote: > > > > From: João Paulo Rechi Vita <jprvita@xxxxxxxxx> > > > > If a process tries to register a profile implementation that is already > > registered, RegisterProfile should fail. > > > > This should help address issues when two instances of PulseAudio are > > running at the same time, and the second instance tries to register an > > audio profile implementation that has already been registered by the > > first instance. Two situations where this may happen is when more than > > one user is logged in, or during the transition between the GDM session > > and the user session, when PulseAudio gets started on the new session > > before the old session has been fully terminated. > > > > https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/303 > > https://gitlab.gnome.org/GNOME/gdm/-/issues/486 > > Any feedback on these changes? I have > https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/593 > on the PulseAudio side, and we have been shipping these changes on > Endless OS to address the case where PulseAudio gets started on the > user session before PulseAudio on the GDM session has finished. > > Thanks, > > João Paulo. > > > --- > > src/profile.c | 30 ++++++++++++++++++++++++++++++ > > 1 file changed, 30 insertions(+) > > > > diff --git a/src/profile.c b/src/profile.c > > index 5e460b639..60d17b6ae 100644 > > --- a/src/profile.c > > +++ b/src/profile.c > > @@ -749,6 +749,30 @@ void btd_profile_foreach(void (*func)(struct btd_profile *p, void *data), > > } > > } > > > > +static struct btd_profile *btd_profile_find_uuid(const char *uuid) > > +{ > > + GSList *l, *next; > > + > > + for (l = profiles; l != NULL; l = next) { > > + struct btd_profile *p = l->data; > > + > > + if (!g_strcmp0(p->local_uuid, uuid)) > > + return p; > > + next = g_slist_next(l); > > + } > > + > > + for (l = ext_profiles; l != NULL; l = next) { > > + struct ext_profile *ext = l->data; > > + struct btd_profile *p = &ext->p; > > + > > + if (!g_strcmp0(p->local_uuid, uuid)) > > + return p; > > + next = g_slist_next(l); > > + } > > + > > + return NULL; > > +} > > + > > int btd_profile_register(struct btd_profile *profile) > > { > > profiles = g_slist_append(profiles, profile); > > @@ -2441,6 +2465,12 @@ static DBusMessage *register_profile(DBusConnection *conn, > > dbus_message_iter_get_basic(&args, &uuid); > > dbus_message_iter_next(&args); > > > > + if (btd_profile_find_uuid(uuid)) { > > + warn("%s tried to register %s which is already registered", > > + sender, uuid); > > + return btd_error_not_permitted(msg, "UUID already registered"); > > + } > > + > > if (dbus_message_iter_get_arg_type(&args) != DBUS_TYPE_ARRAY) > > return btd_error_invalid_args(msg); > > > > -- > > 2.20.1 > > Applied, thanks. -- Luiz Augusto von Dentz