[lttng-dev] [RFC PATCH LTTNG-UST] Fix: Decrement sem_count when disabling local apps

Jérémie Galarneau jeremie.galarneau at efficios.com
Tue Jul 7 12:49:17 EDT 2015


On Tue, Jul 7, 2015 at 12:48 PM, Jérémie Galarneau <
jeremie.galarneau at efficios.com> wrote:

> LTTng-UST will deadlock waiting on the "constructor_wait" semaphore
> if local apps, handled the session daemon running under the current UID,
> are disabled or "not_allowed".
>
> This deadlock can be triggered by setting an infinite registration
> timeout and clearing the HOME environment variable, which will cause
> setup_local_apps() to fail to determine the local_apps sock_path, thus
> leaving local_apps.allowed == 0.
>
> Given that local_apps are not allowed at this point, the local_apps
> listener thread will not be launched. Therefore, the constructor_wait
> will not be waited on.
>

This should say "will not be posted".

Jérémie


>
> The fix proposed here consists in decrementing "sem_count" if an error
> precluding the launch the the local_apps listener thread occurs.
>
> Signed-off-by: Jérémie Galarneau <jeremie.galarneau at efficios.com>
> ---
>  liblttng-ust/lttng-ust-comm.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c
> index b290204..c91627f 100644
> --- a/liblttng-ust/lttng-ust-comm.c
> +++ b/liblttng-ust/lttng-ust-comm.c
> @@ -373,6 +373,7 @@ void print_cmd(int cmd, int handle)
>  static
>  int setup_local_apps(void)
>  {
> +       int ret = 0;
>         const char *home_dir;
>         uid_t uid;
>
> @@ -382,13 +383,16 @@ int setup_local_apps(void)
>          */
>         if (uid != geteuid()) {
>                 assert(local_apps.allowed == 0);
> -               return 0;
> +               goto end;
>         }
>         home_dir = get_lttng_home_dir();
>         if (!home_dir) {
>                 WARN("HOME environment variable not set. Disabling
> LTTng-UST per-user tracing.");
>                 assert(local_apps.allowed == 0);
> -               return -ENOENT;
> +               ret = -ENOENT;
> +               goto end;
> +       } else {
> +               DBG("home_dir: %s", home_dir);
>         }
>         local_apps.allowed = 1;
>         snprintf(local_apps.sock_path, PATH_MAX, "%s/%s/%s",
> @@ -398,7 +402,15 @@ int setup_local_apps(void)
>         snprintf(local_apps.wait_shm_path, PATH_MAX, "/%s-%u",
>                 LTTNG_UST_WAIT_FILENAME,
>                 uid);
> -       return 0;
> +end:
> +       if (!local_apps.allowed) {
> +               /*
> +                * Don't wait on the "local" listener thread since we
> won't be
> +                * communicating with the local session daemon.
> +                */
> +               uatomic_add(&sem_count, -1);
> +       }
> +       return ret;
>  }
>
>  /*
> --
> 2.4.4
>
>


-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lttng.org/pipermail/lttng-dev/attachments/20150707/87020ed9/attachment.html>


More information about the lttng-dev mailing list