mirror of
https://gitlab.freedesktop.org/libbsd/libbsd.git
synced 2025-10-27 19:10:23 +01:00
Move setproctitle() automatic initialization to its own library
The automatic initialization cannot be part of the main shared library, because there is no thread-safe way to change the environ global variable. This is not a problem if the initializaion happens just at program load time, but becomes one if the shared library is directly or indirectly dlopen()ed during the execution of the program, which could have either kept references to the old environ or could change it in some other thread. This has been observed for example on systems using Samba NSS modules. To avoid any other possible fallout, the constructor is split into a new static library that needs to be linked explicitly into programs using setproctitle(). As an additional safety measure the pkg-config linker flags will mark the program as not allowing to be dlopen()ed so that we avoid the problem described above. Reported-by: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=66679
This commit is contained in:
@@ -153,8 +153,8 @@ spt_copyargs(int argc, char *argv[])
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
spt_init(int argc, char *argv[], char *envp[])
|
||||
void
|
||||
setproctitle_init(int argc, char *argv[], char *envp[])
|
||||
{
|
||||
char *base, *end, *nul, *tmp;
|
||||
int i, envc, error;
|
||||
@@ -215,14 +215,6 @@ spt_init(int argc, char *argv[], char *envp[])
|
||||
SPT.end = end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Force spt_init() function into the .init_array section instead of expecting
|
||||
* either the compiler to place constructors there or the linker to move them
|
||||
* from .ctors to .init_array.
|
||||
*/
|
||||
void (*spt_init_func)(int argc, char *argv[], char *envp[])
|
||||
__attribute__((section(".init_array"))) = spt_init;
|
||||
|
||||
#ifndef SPT_MAXTITLE
|
||||
#define SPT_MAXTITLE 255
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user