[PATCH] Bug 11941: Improper assert map->l_init_called in dlclose

Florian Weimer fweimer@redhat.com
Thu Dec 22 09:36:00 GMT 2016


On 12/22/2016 06:36 AM, Carlos O'Donell wrote:

> +  /* We must take the lock to examine the contents of map whose
> +     l_flags_1 or l_direct_opencount may be modified by concurrent
> +     dlopen calls.  */
> +  __rtld_lock_lock_recursive (GL(dl_load_lock));
> +
>    /* First see whether we can remove the object at all.  */
>    if (__glibc_unlikely (map->l_flags_1 & DF_1_NODELETE))
>      {
> -      assert (map->l_init_called);
>        /* Nope.  Do nothing.  */
> +      __rtld_lock_unlock_recursive (GL(dl_load_lock));
>        return;
>      }
>
>    if (__builtin_expect (map->l_direct_opencount, 1) == 0)
>      _dl_signal_error (0, map->l_name, NULL, N_("shared object not open"));

Missing unlock before non-local exit.

The plugin should have some reference to a symbol defined by the other 
DSO, so that if ld applies --as-needed by default for some reason, the 
test still has the expected behavior.

> diff --git a/elf/tst-nodelete-dlclose-dso.c b/elf/tst-nodelete-dlclose-dso.c

> +void (*plugin_func)(void);

Missing space before paramter list.  Those variables could be static.

> +#define LIB_PLUGIN "tst-nodelete-dlclose-plugin.so"
> +
> +void
> +primary(void)

Likewise.

> +{
> +  char *error;
> +
> +  plugin_lib = dlopen (LIB_PLUGIN, RTLD_NOW | RTLD_LOCAL | RTLD_NODELETE);
> +  if (!plugin_lib)

Comparison against NULL is required by the style guide.

> +__attribute__((destructor))
> +void
> +primary_dtor(void)

Missing space before parameter list.  Function could be static.

> diff --git a/elf/tst-nodelete-dlclose-plugin.c b/elf/tst-nodelete-dlclose-plugin.c

> +plugin(void)

Likewise.

> +{
> +  printf("INFO: Calling plugin function.\n");

Likewise.

> +}
> +
> +__attribute__((destructor))

Likewise.

> +static void
> +plugin_dtor(void)

Likewise.

> +{
> +  printf("INFO: Calling plugin destructor.\n");

Likewise.

> diff --git a/elf/tst-nodelete-dlclose.c b/elf/tst-nodelete-dlclose.c

> +extern void primary(void);

Likewise.

> +
> +static int
> +do_test(void)

Likewise.

> +{
> +  printf ("INFO: Starting applicaiton.\n");

Typo: application

Thanks,
Florian



More information about the Libc-alpha mailing list