On Wed, 21 Sep 2016, at 03:25 PM, Tanu Kaskinen wrote:
> When unloading a module, lt_dlclose() may remove the module from memory.
> If a module unloads itself, it's not safe to call lt_dlclose()
> synchronously from pa_module_unload(), because the execution may return
> to the module code that was removed from memory. To avoid this
> situation, let's postpone lt_dlclose() until it's safe to call it.
> 
> BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=96831
> ---
>  src/pulsecore/module.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/src/pulsecore/module.c b/src/pulsecore/module.c
> index 7cba3a7..ac15815 100644
> --- a/src/pulsecore/module.c
> +++ b/src/pulsecore/module.c
> @@ -228,6 +228,12 @@ fail:
>      return NULL;
>  }
>  
> +static void postponed_dlclose(pa_mainloop_api *api, void *userdata) {
> +    lt_dlhandle dl = userdata;
> +
> +    lt_dlclose(dl);
> +}
> +
>  static void pa_module_free(pa_module *m) {
>      pa_assert(m);
>      pa_assert(m->core);
> @@ -246,7 +252,15 @@ static void pa_module_free(pa_module *m) {
>      if (m->proplist)
>          pa_proplist_free(m->proplist);
>  
> -    lt_dlclose(m->dl);
> +    /* If a module unloads itself with pa_module_unload(), we can't call
> +     * lt_dlclose() here, because otherwise pa_module_unload() may
> return to a
> +     * code location that has been removed from memory. Therefore, let's
> +     * postpone the lt_dlclose() call a bit.
> +     *
> +     * Apparently lt_dlclose() doesn't always remove the module from
> memory,
> +     * but it can happen, as can be seen here:
> +     * https://bugs.freedesktop.org/show_bug.cgi?id=96831 */
> +    pa_mainloop_api_once(m->core->mainloop, postponed_dlclose, m->dl);
>  
>      pa_hashmap_remove(m->core->modules_pending_unload, m);

LGTM.

-- Arun
_______________________________________________
pulseaudio-discuss mailing list
pulseaudio-discuss@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to