[PATCH] posix: Move environ helper variables next to environ definition (bug 32541)
H.J. Lu
hjl.tools@gmail.com
Fri Mar 7 20:33:14 GMT 2025
On Sat, Mar 8, 2025 at 12:33 AM Florian Weimer <fweimer@redhat.com> wrote:
>
> This helps with statically interposing getenv.
>
> Updates commit 7a61e7f557a97ab597d6fca5e2d1f13f65685c61
> ("stdlib: Make getenv thread-safe in more cases").
>
> ---
> posix/environ.c | 4 ++++
> stdlib/Makefile | 2 ++
> stdlib/getenv.c | 3 ---
> stdlib/tst-getenv-static.c | 38 ++++++++++++++++++++++++++++++++++++++
> 4 files changed, 44 insertions(+), 3 deletions(-)
>
> diff --git a/posix/environ.c b/posix/environ.c
> index a0ed0d80ea..924effe3cd 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 1c4fa2382f..c9c8f702a2 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 5e7212cca6..1a7b0bfc06 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 0000000000..f5f484c83a
> --- /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>
>
> base-commit: 59dc232df277c21239c357e3519682c26e182cd7
>
LGTM.
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
Thanks.
--
H.J.
More information about the Libc-alpha
mailing list