core: reliably check if varlink socket has been deserialized
authorMike Yuan <me@yhndnzj.com>
Tue, 23 Jul 2024 15:55:12 +0000 (17:55 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Wed, 24 Jul 2024 12:26:49 +0000 (14:26 +0200)
commitb825a8be0b7b857a715e982cee861e8ae6995ee8
treeb88cf1c61ea5b6aa6d17d59c4ee0554a7fccf132
parent83c9043727eb87b82e2100945e83e0aae75d8b05
core: reliably check if varlink socket has been deserialized

Follow-up for 6906c028e83b77b35eaaf87b27d0fe5c6e1984b7

The mentioned commit uses access() to check if varlink socket
already exists in the filesystem, but that isn't sufficient.

> Varlink sockets are not serialized until v252, so upgrading from
> v251 or older means we will not listen anymore on the varlink sockets.
>
> See https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1074789
> for more details as this was found when updating from Debian Bullseye to a new version.

After this commit, the set up of varlink_server is effectively
split into two steps. manager_varlink_init_system(), which is
called after deserialization, would no longer skip listening
even if Manager.varlink_server is in place, but actually
check if we're listening on desired sockets.
Then, manager_deserialize() can be switched back to using
manager_setup_varlink_server().

Alternative to #33817

Co-authored-by: Luca Boccassi <bluca@debian.org>
(cherry picked from commit d4e5c66ed469c822ca5346c7a445ec1446b1d17f)
src/core/core-varlink.c
src/core/core-varlink.h
src/core/manager-serialize.c
src/shared/varlink-internal.h
src/shared/varlink.c