[PATCH v2] Look for ModuleData only in appropriate library

Peter Hutterer peter.hutterer at who-t.net
Wed Jul 4 15:25:02 PDT 2012


On Thu, Jun 28, 2012 at 05:17:12PM +0200, Michal Srb wrote:
> LoaderSymbol calls dlsym with RTLD_DEFAULT pseudo handle making it search in
> every loaded library. In addition glibc adds NODELETE flag to the library
> containing the symbol.
> 
> It's used in doLoadModule to locate <modulename>ModuleData symbol, the
> module's library gets the flag and is kept in memory even after it is
> unloaded.
> 
> This patch adds LoaderSymbolFromModule function that looks for symbol only in
> library specified by handle. That way the NODELETE flag isn't added.
> 
> This glibc behavior doesn't seem to be documented, but even if other
> implementations differ, there is no reason to search ModuleData symbol outside
> the module's library.
> 
> Signed-off-by: Michal Srb <msrb at suse.com>
> Reviewed-by: Daniel Stone <daniel at fooishbar.org>
> 
> v2: Switch LoaderSymbolFromModule arguments order.
>     Correct description.

scooped this one up into my tree, it's been merged. thanks.

Cheers,
  Peter

> 
> diff --git a/hw/xfree86/loader/loader.c b/hw/xfree86/loader/loader.c
> index b72b8b8..4836964 100644
> --- a/hw/xfree86/loader/loader.c
> +++ b/hw/xfree86/loader/loader.c
> @@ -160,6 +160,12 @@ LoaderSymbol(const char *name)
>      return NULL;
>  }
>  
> +void *
> +LoaderSymbolFromModule(void *handle, const char *name)
> +{
> +    return dlsym(handle, name);
> +}
> +
>  void
>  LoaderUnload(const char *name, void *handle)
>  {
> diff --git a/hw/xfree86/loader/loader.h b/hw/xfree86/loader/loader.h
> index 5cadd5a..c89c641 100644
> --- a/hw/xfree86/loader/loader.h
> +++ b/hw/xfree86/loader/loader.h
> @@ -72,5 +72,6 @@ extern unsigned long LoaderOptions;
>  
>  /* Internal Functions */
>  void *LoaderOpen(const char *, int *, int *);
> +void *LoaderSymbolFromModule(void *, const char *);
>  
>  #endif                          /* _LOADER_H */
> diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c
> index 706b9b3..1e6dc00 100644
> --- a/hw/xfree86/loader/loadmod.c
> +++ b/hw/xfree86/loader/loadmod.c
> @@ -956,7 +956,7 @@ doLoadModule(const char *module, const char *path, const char **subdirlist,
>              *errmin = 0;
>          goto LoadModule_fail;
>      }
> -    initdata = LoaderSymbol(p);
> +    initdata = LoaderSymbolFromModule(ret->handle, p);
>      if (initdata) {
>          ModuleSetupProc setup;
>          ModuleTearDownProc teardown;
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list