[pulseaudio-discuss] [PATCH] Don't abort on double module load

Tanu Kaskinen tanuk at iki.fi
Sun Aug 27 09:56:26 UTC 2017


On Sat, 2017-08-26 at 11:39 +0200, Colin Leroy wrote:
> Hello,
> 
> I recently had to investigate quite a bit why PulseAudio started to
> abort on my computer, and finally figured out the reason :
> 
> - I had "module-load module-raop-discover" set in /etc/pulse/default.pa
> - I fiddled with `paprefs` while PA was running and checked "Make
>   discoverable Apple AirTunes sound devices available locally"
> - This triggered a load of module-raop-discover via module-gconf, which
>   failed silently because the module was already loaded:
> 
> D: [pulseaudio] module-gconf.c: Loading module 'module-raop-discover'
>   with args '' due to GConf configuration.
> E: [pulseaudio] module.c: Module "module-raop-discover" should be
>   loaded once at most. Refusing to load.
> E: [pulseaudio] module-gconf.c: pa_module_load() failed
> 
> - At the next reboot, module-raop-discover was loaded via module-gconf,
>   then cli-command tried to load it again, failed and PulseAudio exited.
> 
> The attached patch fixes it by adding an optional error code pointer to
> pa_module_load(), and checking for the error code in cli-command.
> 
> I don't know if this is an acceptable solution for the PulseAudio team,
> I'm not even sure that's a case you want to handle, but I thought it
> would be worth it to mention this problem to you, gather your input
> on the subject and come up with an idea to handle it.

The solution seems good to me. Just a couple of minor issues:

We don't have a whole lot of functions that need to both allocate a new
object and report the reason on failure, but there is some precedent.
At least pa_sink_input_new() and pa_source_output_new() are this kind
of functions, and they return the two things differently than
pa_module_load() in your patch. I think we should be consistent, so
pa_module_load() should return the error code as the function return
value, and the first argument of pa_module_load() should be a pointer
to a pa_module pointer.

The error codes should be from the pa_error_code_t enumeration.

pa_module_load() starts with this:

    errcode = -EIO; /* default error */

However, you always set errcode explicitly in every error case (which
is good), so this line is not needed, and it will also prevent the
compiler from issuing a warning if setting errcode is forgotten when
adding a new error case.

-- 
Tanu

https://www.patreon.com/tanuk


More information about the pulseaudio-discuss mailing list