diff options
author | Florian Weimer <fweimer@redhat.com> | 2025-03-07 21:40:55 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2025-03-07 21:40:55 +0100 |
commit | 6ef0bd02dbe34aab8b956ffa2db5679341d520f5 (patch) | |
tree | b73958ffe535e02cefae47e3d3086e4dc7edd17a | |
parent | 77261698b4e938020a1b2032709a54d942ba330f (diff) | |
download | glibc-6ef0bd02dbe34aab8b956ffa2db5679341d520f5.zip glibc-6ef0bd02dbe34aab8b956ffa2db5679341d520f5.tar.gz glibc-6ef0bd02dbe34aab8b956ffa2db5679341d520f5.tar.bz2 |
posix: Move environ helper variables next to environ definition (bug 32541)
This helps with statically interposing getenv.
Updates commit 7a61e7f557a97ab597d6fca5e2d1f13f65685c61
("stdlib: Make getenv thread-safe in more cases").
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
-rw-r--r-- | posix/environ.c | 4 | ||||
-rw-r--r-- | stdlib/Makefile | 2 | ||||
-rw-r--r-- | stdlib/getenv.c | 3 | ||||
-rw-r--r-- | stdlib/tst-getenv-static.c | 38 |
4 files changed, 44 insertions, 3 deletions
diff --git a/posix/environ.c b/posix/environ.c index a0ed0d8..924effe 100644 --- a/posix/environ.c +++ b/posix/environ.c @@ -2,6 +2,7 @@ #include <unistd.h> #include <stddef.h> +#include <stdlib/setenv.h> /* This must be initialized; we cannot have a weak alias into bss. */ char **__environ = NULL; @@ -10,3 +11,6 @@ weak_alias (__environ, environ) /* The SVR4 ABI says `_environ' will be the name to use in case the user overrides the weak alias `environ'. */ weak_alias (__environ, _environ) + +struct environ_array *__environ_array_list; +environ_counter __environ_counter; diff --git a/stdlib/Makefile b/stdlib/Makefile index 1c4fa23..c9c8f70 100644 --- a/stdlib/Makefile +++ b/stdlib/Makefile @@ -282,6 +282,7 @@ tests := \ tst-environ-change-3 \ tst-environ-change-4 \ tst-getenv-signal \ + tst-getenv-static \ tst-getenv-thread \ tst-getenv-unsetenv \ tst-getrandom \ @@ -377,6 +378,7 @@ tests-internal := \ # tests-internal tests-static := \ + tst-getenv-static \ tst-secure-getenv \ # tests-static diff --git a/stdlib/getenv.c b/stdlib/getenv.c index 5e7212c..1a7b0bf 100644 --- a/stdlib/getenv.c +++ b/stdlib/getenv.c @@ -20,9 +20,6 @@ #include <string.h> #include <unistd.h> -struct environ_array *__environ_array_list; -environ_counter __environ_counter; - char * getenv (const char *name) { diff --git a/stdlib/tst-getenv-static.c b/stdlib/tst-getenv-static.c new file mode 100644 index 0000000..f5f484c --- /dev/null +++ b/stdlib/tst-getenv-static.c @@ -0,0 +1,38 @@ +/* Static interposition of getenv (bug 32541). + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <support/check.h> + +/* Some programs try to interpose getenv for their own use (not + glibc's internal use). Make sure that this is possible without + introducing linker failures due to duplicate symbols. */ + +char * +getenv (const char *ignored) +{ + return NULL; +} + +static int +do_test (void) +{ + TEST_COMPARE_STRING (getenv ("PATH"), NULL); + return 0; +} + +#include <support/test-driver.c> |