diff mbox series

[v2,3/4] support: Add envp argument to support_capture_subprogram

Message ID 20240502163716.1107975-4-adhemerval.zanella@linaro.org
State Superseded
Headers show
Series More tunable fixes | expand

Commit Message

Adhemerval Zanella Netto May 2, 2024, 4:35 p.m. UTC
So tests can specific a list of environment variables.
---
 elf/tst-audit18.c                        | 2 +-
 elf/tst-audit19b.c                       | 2 +-
 elf/tst-audit22.c                        | 2 +-
 elf/tst-audit23.c                        | 2 +-
 elf/tst-audit25a.c                       | 4 ++--
 elf/tst-audit25b.c                       | 4 ++--
 elf/tst-glibc-hwcaps-2-cache.c           | 2 +-
 elf/tst-rtld-run-static.c                | 4 ++--
 elf/tst-tunables-enable_secure.c         | 2 +-
 elf/tst-tunables.c                       | 2 +-
 support/capture_subprocess.h             | 9 +++++----
 support/subprocess.h                     | 7 ++++---
 support/support_capture_subprocess.c     | 5 +++--
 support/support_subprocess.c             | 5 +++--
 support/tst-support_capture_subprocess.c | 2 +-
 sysdeps/x86/tst-hwcap-tunables.c         | 2 +-
 16 files changed, 30 insertions(+), 26 deletions(-)

Comments

Siddhesh Poyarekar May 3, 2024, 3:06 p.m. UTC | #1
On 2024-05-02 12:35, Adhemerval Zanella wrote:
> So tests can specific a list of environment variables.
> ---

The commit typo Joe pointed in v1 still exists ^^ s/specific/specify/. 
LGTM otherwise, please fix up the commit message before pushing.

Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>

>   elf/tst-audit18.c                        | 2 +-
>   elf/tst-audit19b.c                       | 2 +-
>   elf/tst-audit22.c                        | 2 +-
>   elf/tst-audit23.c                        | 2 +-
>   elf/tst-audit25a.c                       | 4 ++--
>   elf/tst-audit25b.c                       | 4 ++--
>   elf/tst-glibc-hwcaps-2-cache.c           | 2 +-
>   elf/tst-rtld-run-static.c                | 4 ++--
>   elf/tst-tunables-enable_secure.c         | 2 +-
>   elf/tst-tunables.c                       | 2 +-
>   support/capture_subprocess.h             | 9 +++++----
>   support/subprocess.h                     | 7 ++++---
>   support/support_capture_subprocess.c     | 5 +++--
>   support/support_subprocess.c             | 5 +++--
>   support/tst-support_capture_subprocess.c | 2 +-
>   sysdeps/x86/tst-hwcap-tunables.c         | 2 +-
>   16 files changed, 30 insertions(+), 26 deletions(-)
> 
> diff --git a/elf/tst-audit18.c b/elf/tst-audit18.c
> index 841251dd70..cec93e269c 100644
> --- a/elf/tst-audit18.c
> +++ b/elf/tst-audit18.c
> @@ -79,7 +79,7 @@ do_test (int argc, char *argv[])
>   
>     setenv ("LD_AUDIT", "tst-auditmod18.so", 0);
>     struct support_capture_subprocess result
> -    = support_capture_subprogram (spargv[0], spargv);
> +    = support_capture_subprogram (spargv[0], spargv, NULL);
>     support_capture_subprocess_check (&result, "tst-audit18", 0, sc_allow_stderr);
>   
>     struct
> diff --git a/elf/tst-audit19b.c b/elf/tst-audit19b.c
> index 70bfe4eadf..88d99a416b 100644
> --- a/elf/tst-audit19b.c
> +++ b/elf/tst-audit19b.c
> @@ -69,7 +69,7 @@ do_test (int argc, char *argv[])
>   
>     setenv ("LD_AUDIT", "tst-auditmod18b.so", 0);
>     struct support_capture_subprocess result
> -    = support_capture_subprogram (spargv[0], spargv);
> +    = support_capture_subprogram (spargv[0], spargv, NULL);
>     support_capture_subprocess_check (&result, "tst-audit18b", 0, sc_allow_stderr);
>   
>     bool find_symbind = false;
> diff --git a/elf/tst-audit22.c b/elf/tst-audit22.c
> index 4e97be3be0..6aa18af948 100644
> --- a/elf/tst-audit22.c
> +++ b/elf/tst-audit22.c
> @@ -83,7 +83,7 @@ do_test (int argc, char *argv[])
>   
>     setenv ("LD_AUDIT", "tst-auditmod22.so", 0);
>     struct support_capture_subprocess result
> -    = support_capture_subprogram (spargv[0], spargv);
> +    = support_capture_subprogram (spargv[0], spargv, NULL);
>     support_capture_subprocess_check (&result, "tst-audit22", 0, sc_allow_stderr);
>   
>     /* The respawned process should always print the vDSO address (otherwise it
> diff --git a/elf/tst-audit23.c b/elf/tst-audit23.c
> index 32e7c8b2a3..d2640fe8b2 100644
> --- a/elf/tst-audit23.c
> +++ b/elf/tst-audit23.c
> @@ -82,7 +82,7 @@ do_test (int argc, char *argv[])
>   
>     setenv ("LD_AUDIT", "tst-auditmod23.so", 0);
>     struct support_capture_subprocess result
> -    = support_capture_subprogram (spargv[0], spargv);
> +    = support_capture_subprogram (spargv[0], spargv, NULL);
>     support_capture_subprocess_check (&result, "tst-audit22", 0, sc_allow_stderr);
>   
>     /* The expected la_objopen/la_objclose:
> diff --git a/elf/tst-audit25a.c b/elf/tst-audit25a.c
> index b209ee820f..cdd4f2ce2b 100644
> --- a/elf/tst-audit25a.c
> +++ b/elf/tst-audit25a.c
> @@ -77,7 +77,7 @@ do_test (int argc, char *argv[])
>   
>     {
>       struct support_capture_subprocess result
> -      = support_capture_subprogram (spargv[0], spargv);
> +      = support_capture_subprogram (spargv[0], spargv, NULL);
>       support_capture_subprocess_check (&result, "tst-audit25a", 0,
>   				      sc_allow_stderr);
>   
> @@ -102,7 +102,7 @@ do_test (int argc, char *argv[])
>     {
>       setenv ("LD_BIND_NOW", "1", 0);
>       struct support_capture_subprocess result
> -      = support_capture_subprogram (spargv[0], spargv);
> +      = support_capture_subprogram (spargv[0], spargv, NULL);
>       support_capture_subprocess_check (&result, "tst-audit25a", 0,
>   				      sc_allow_stderr);
>   
> diff --git a/elf/tst-audit25b.c b/elf/tst-audit25b.c
> index 9b8665d517..939f4d6188 100644
> --- a/elf/tst-audit25b.c
> +++ b/elf/tst-audit25b.c
> @@ -76,7 +76,7 @@ do_test (int argc, char *argv[])
>   
>     {
>       struct support_capture_subprocess result
> -      = support_capture_subprogram (spargv[0], spargv);
> +      = support_capture_subprogram (spargv[0], spargv, NULL);
>       support_capture_subprocess_check (&result, "tst-audit25a", 0,
>   				      sc_allow_stderr);
>   
> @@ -102,7 +102,7 @@ do_test (int argc, char *argv[])
>     {
>       setenv ("LD_BIND_NOW", "1", 0);
>       struct support_capture_subprocess result
> -      = support_capture_subprogram (spargv[0], spargv);
> +      = support_capture_subprogram (spargv[0], spargv, NULL);
>       support_capture_subprocess_check (&result, "tst-audit25a", 0,
>   				      sc_allow_stderr);
>   
> diff --git a/elf/tst-glibc-hwcaps-2-cache.c b/elf/tst-glibc-hwcaps-2-cache.c
> index 81ab44ff78..af91476cca 100644
> --- a/elf/tst-glibc-hwcaps-2-cache.c
> +++ b/elf/tst-glibc-hwcaps-2-cache.c
> @@ -32,7 +32,7 @@ main (int argc, char **argv)
>     /* Run ldconfig to populate the cache.  */
>     char *command = xasprintf ("%s/ldconfig", support_install_rootsbindir);
>     struct support_capture_subprocess result =
> -    support_capture_subprogram (command,  &((char *) { NULL }));
> +    support_capture_subprogram (command,  &((char *) { NULL }), NULL);
>     support_capture_subprocess_check (&result, "ldconfig", 0, sc_allow_none);
>     free (command);
>   
> diff --git a/elf/tst-rtld-run-static.c b/elf/tst-rtld-run-static.c
> index b2650e85ff..f05c00eb7b 100644
> --- a/elf/tst-rtld-run-static.c
> +++ b/elf/tst-rtld-run-static.c
> @@ -30,7 +30,7 @@ do_test (void)
>     {
>       char *argv[] = { (char *) "ld.so", ldconfig_path, (char *) "--help", NULL };
>       struct support_capture_subprocess cap
> -      = support_capture_subprogram (support_objdir_elf_ldso, argv);
> +      = support_capture_subprogram (support_objdir_elf_ldso, argv, NULL);
>       support_capture_subprocess_check (&cap, "no --argv0", 0, sc_allow_stdout);
>       puts ("info: output without --argv0:");
>       puts (cap.out.buffer);
> @@ -46,7 +46,7 @@ do_test (void)
>           ldconfig_path, (char *) "--help", NULL
>         };
>       struct support_capture_subprocess cap
> -      = support_capture_subprogram (support_objdir_elf_ldso, argv);
> +      = support_capture_subprogram (support_objdir_elf_ldso, argv, NULL);
>       support_capture_subprocess_check (&cap, "with --argv0", 0, sc_allow_stdout);
>       puts ("info: output with --argv0:");
>       puts (cap.out.buffer);
> diff --git a/elf/tst-tunables-enable_secure.c b/elf/tst-tunables-enable_secure.c
> index e31e1f7faa..f5db1c84e9 100644
> --- a/elf/tst-tunables-enable_secure.c
> +++ b/elf/tst-tunables-enable_secure.c
> @@ -113,7 +113,7 @@ do_test (int argc, char *argv[])
>         printf ("[%d] Spawned test for %s\n", i, tests[i].env);
>         setenv ("GLIBC_TUNABLES", tests[i].env, 1);
>         struct support_capture_subprocess result
> -	= support_capture_subprogram (spargv[0], spargv);
> +	= support_capture_subprogram (spargv[0], spargv, NULL);
>         support_capture_subprocess_check (&result, "tst-tunables-enable_secure",
>   		                        0, sc_allow_stderr);
>         support_capture_subprocess_free (&result);
> diff --git a/elf/tst-tunables.c b/elf/tst-tunables.c
> index 8f4ee46ad5..a2b3a677e2 100644
> --- a/elf/tst-tunables.c
> +++ b/elf/tst-tunables.c
> @@ -393,7 +393,7 @@ do_test (int argc, char *argv[])
>   	      tests[i].value);
>         setenv (tests[i].name, tests[i].value, 1);
>         struct support_capture_subprocess result
> -	= support_capture_subprogram (spargv[0], spargv);
> +	= support_capture_subprogram (spargv[0], spargv, NULL);
>         support_capture_subprocess_check (&result, "tst-tunables", 0,
>   					sc_allow_stderr);
>         support_capture_subprocess_free (&result);
> diff --git a/support/capture_subprocess.h b/support/capture_subprocess.h
> index 1ecbdfe4fc..93b7245d2a 100644
> --- a/support/capture_subprocess.h
> +++ b/support/capture_subprocess.h
> @@ -35,11 +35,12 @@ struct support_capture_subprocess
>   struct support_capture_subprocess support_capture_subprocess
>     (void (*callback) (void *), void *closure);
>   
> -/* Issue FILE with ARGV arguments by using posix_spawn and capture standard
> -   output, standard error, and the exit status.  The out.buffer and err.buffer
> -   are handle as support_capture_subprocess.  */
> +/* Issue FILE with ARGV arguments and ENVP environments by using posix_spawn
> +   and capture standard output, standard error, and the exit status.  If
> +   ENVP is NULL the current environment variable is used.  The out.buffer and
> +   err.buffer are handle by support_capture_subprocess.  */
>   struct support_capture_subprocess support_capture_subprogram
> -  (const char *file, char *const argv[]);
> +  (const char *file, char *const argv[], char *const envp[]);
>   
>   /* Copy the running program into a setgid binary and run it with CHILD_ID
>      argument.  If execution is successful, return the exit status of the child
> diff --git a/support/subprocess.h b/support/subprocess.h
> index 8fbb895353..8274a2b22b 100644
> --- a/support/subprocess.h
> +++ b/support/subprocess.h
> @@ -33,10 +33,11 @@ struct support_subprocess
>   struct support_subprocess support_subprocess
>     (void (*callback) (void *), void *closure);
>   
> -/* Issue FILE with ARGV arguments by using posix_spawn and return is PID, a
> -   pipe redirected to STDOUT, and a pipe redirected to STDERR.  */
> +/* Issue FILE with ARGV arguments and ENVP environments by using posix_spawn
> +   and return is PID, a pipe redirected to STDOUT, and a pipe redirected to
> +   STDERR.  If ENVP is NULL the current environment variable is used.  */
>   struct support_subprocess support_subprogram
> -  (const char *file, char *const argv[]);
> +  (const char *file, char *const argv[], char *const envp[]);
>   
>   /* Invoke program FILE with ARGV arguments by using posix_spawn and wait for it
>      to complete.  Return program exit status.  */
> diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c
> index ffced8a89f..53847194cb 100644
> --- a/support/support_capture_subprocess.c
> +++ b/support/support_capture_subprocess.c
> @@ -93,13 +93,14 @@ support_capture_subprocess (void (*callback) (void *), void *closure)
>   }
>   
>   struct support_capture_subprocess
> -support_capture_subprogram (const char *file, char *const argv[])
> +support_capture_subprogram (const char *file, char *const argv[],
> +			    char *const envp[])
>   {
>     struct support_capture_subprocess result;
>     xopen_memstream (&result.out);
>     xopen_memstream (&result.err);
>   
> -  struct support_subprocess proc = support_subprogram (file, argv);
> +  struct support_subprocess proc = support_subprogram (file, argv, envp);
>   
>     support_capture_poll (&result, &proc);
>     return result;
> diff --git a/support/support_subprocess.c b/support/support_subprocess.c
> index a2fef394d4..b692a7f8b1 100644
> --- a/support/support_subprocess.c
> +++ b/support/support_subprocess.c
> @@ -69,7 +69,7 @@ support_subprocess (void (*callback) (void *), void *closure)
>   }
>   
>   struct support_subprocess
> -support_subprogram (const char *file, char *const argv[])
> +support_subprogram (const char *file, char *const argv[], char *const envp[])
>   {
>     struct support_subprocess result = support_subprocess_init ();
>   
> @@ -84,7 +84,8 @@ support_subprogram (const char *file, char *const argv[])
>     xposix_spawn_file_actions_addclose (&fa, result.stdout_pipe[1]);
>     xposix_spawn_file_actions_addclose (&fa, result.stderr_pipe[1]);
>   
> -  result.pid = xposix_spawn (file, &fa, NULL, argv, environ);
> +  result.pid = xposix_spawn (file, &fa, NULL, argv,
> +			     envp == NULL ? environ : envp);
>   
>     xclose (result.stdout_pipe[1]);
>     xclose (result.stderr_pipe[1]);
> diff --git a/support/tst-support_capture_subprocess.c b/support/tst-support_capture_subprocess.c
> index 8145548982..756fb75d19 100644
> --- a/support/tst-support_capture_subprocess.c
> +++ b/support/tst-support_capture_subprocess.c
> @@ -238,7 +238,7 @@ do_subprogram (const struct test *test)
>     args[argc]   = NULL;
>     TEST_VERIFY (argc < argv_size);
>   
> -  return support_capture_subprogram (args[0], args);
> +  return support_capture_subprogram (args[0], args, NULL);
>   }
>   
>   enum test_type
> diff --git a/sysdeps/x86/tst-hwcap-tunables.c b/sysdeps/x86/tst-hwcap-tunables.c
> index f6a65b88de..8589a9fd66 100644
> --- a/sysdeps/x86/tst-hwcap-tunables.c
> +++ b/sysdeps/x86/tst-hwcap-tunables.c
> @@ -133,7 +133,7 @@ do_test (int argc, char *argv[])
>         setenv ("GLIBC_TUNABLES", tunable, 1);
>   
>         struct support_capture_subprocess result
> -	= support_capture_subprogram (spargv[0], spargv);
> +	= support_capture_subprogram (spargv[0], spargv, NULL);
>         support_capture_subprocess_check (&result, "tst-tunables", 0,
>   					sc_allow_stderr);
>         support_capture_subprocess_free (&result);
diff mbox series

Patch

diff --git a/elf/tst-audit18.c b/elf/tst-audit18.c
index 841251dd70..cec93e269c 100644
--- a/elf/tst-audit18.c
+++ b/elf/tst-audit18.c
@@ -79,7 +79,7 @@  do_test (int argc, char *argv[])
 
   setenv ("LD_AUDIT", "tst-auditmod18.so", 0);
   struct support_capture_subprocess result
-    = support_capture_subprogram (spargv[0], spargv);
+    = support_capture_subprogram (spargv[0], spargv, NULL);
   support_capture_subprocess_check (&result, "tst-audit18", 0, sc_allow_stderr);
 
   struct
diff --git a/elf/tst-audit19b.c b/elf/tst-audit19b.c
index 70bfe4eadf..88d99a416b 100644
--- a/elf/tst-audit19b.c
+++ b/elf/tst-audit19b.c
@@ -69,7 +69,7 @@  do_test (int argc, char *argv[])
 
   setenv ("LD_AUDIT", "tst-auditmod18b.so", 0);
   struct support_capture_subprocess result
-    = support_capture_subprogram (spargv[0], spargv);
+    = support_capture_subprogram (spargv[0], spargv, NULL);
   support_capture_subprocess_check (&result, "tst-audit18b", 0, sc_allow_stderr);
 
   bool find_symbind = false;
diff --git a/elf/tst-audit22.c b/elf/tst-audit22.c
index 4e97be3be0..6aa18af948 100644
--- a/elf/tst-audit22.c
+++ b/elf/tst-audit22.c
@@ -83,7 +83,7 @@  do_test (int argc, char *argv[])
 
   setenv ("LD_AUDIT", "tst-auditmod22.so", 0);
   struct support_capture_subprocess result
-    = support_capture_subprogram (spargv[0], spargv);
+    = support_capture_subprogram (spargv[0], spargv, NULL);
   support_capture_subprocess_check (&result, "tst-audit22", 0, sc_allow_stderr);
 
   /* The respawned process should always print the vDSO address (otherwise it
diff --git a/elf/tst-audit23.c b/elf/tst-audit23.c
index 32e7c8b2a3..d2640fe8b2 100644
--- a/elf/tst-audit23.c
+++ b/elf/tst-audit23.c
@@ -82,7 +82,7 @@  do_test (int argc, char *argv[])
 
   setenv ("LD_AUDIT", "tst-auditmod23.so", 0);
   struct support_capture_subprocess result
-    = support_capture_subprogram (spargv[0], spargv);
+    = support_capture_subprogram (spargv[0], spargv, NULL);
   support_capture_subprocess_check (&result, "tst-audit22", 0, sc_allow_stderr);
 
   /* The expected la_objopen/la_objclose:
diff --git a/elf/tst-audit25a.c b/elf/tst-audit25a.c
index b209ee820f..cdd4f2ce2b 100644
--- a/elf/tst-audit25a.c
+++ b/elf/tst-audit25a.c
@@ -77,7 +77,7 @@  do_test (int argc, char *argv[])
 
   {
     struct support_capture_subprocess result
-      = support_capture_subprogram (spargv[0], spargv);
+      = support_capture_subprogram (spargv[0], spargv, NULL);
     support_capture_subprocess_check (&result, "tst-audit25a", 0,
 				      sc_allow_stderr);
 
@@ -102,7 +102,7 @@  do_test (int argc, char *argv[])
   {
     setenv ("LD_BIND_NOW", "1", 0);
     struct support_capture_subprocess result
-      = support_capture_subprogram (spargv[0], spargv);
+      = support_capture_subprogram (spargv[0], spargv, NULL);
     support_capture_subprocess_check (&result, "tst-audit25a", 0,
 				      sc_allow_stderr);
 
diff --git a/elf/tst-audit25b.c b/elf/tst-audit25b.c
index 9b8665d517..939f4d6188 100644
--- a/elf/tst-audit25b.c
+++ b/elf/tst-audit25b.c
@@ -76,7 +76,7 @@  do_test (int argc, char *argv[])
 
   {
     struct support_capture_subprocess result
-      = support_capture_subprogram (spargv[0], spargv);
+      = support_capture_subprogram (spargv[0], spargv, NULL);
     support_capture_subprocess_check (&result, "tst-audit25a", 0,
 				      sc_allow_stderr);
 
@@ -102,7 +102,7 @@  do_test (int argc, char *argv[])
   {
     setenv ("LD_BIND_NOW", "1", 0);
     struct support_capture_subprocess result
-      = support_capture_subprogram (spargv[0], spargv);
+      = support_capture_subprogram (spargv[0], spargv, NULL);
     support_capture_subprocess_check (&result, "tst-audit25a", 0,
 				      sc_allow_stderr);
 
diff --git a/elf/tst-glibc-hwcaps-2-cache.c b/elf/tst-glibc-hwcaps-2-cache.c
index 81ab44ff78..af91476cca 100644
--- a/elf/tst-glibc-hwcaps-2-cache.c
+++ b/elf/tst-glibc-hwcaps-2-cache.c
@@ -32,7 +32,7 @@  main (int argc, char **argv)
   /* Run ldconfig to populate the cache.  */
   char *command = xasprintf ("%s/ldconfig", support_install_rootsbindir);
   struct support_capture_subprocess result =
-    support_capture_subprogram (command,  &((char *) { NULL }));
+    support_capture_subprogram (command,  &((char *) { NULL }), NULL);
   support_capture_subprocess_check (&result, "ldconfig", 0, sc_allow_none);
   free (command);
 
diff --git a/elf/tst-rtld-run-static.c b/elf/tst-rtld-run-static.c
index b2650e85ff..f05c00eb7b 100644
--- a/elf/tst-rtld-run-static.c
+++ b/elf/tst-rtld-run-static.c
@@ -30,7 +30,7 @@  do_test (void)
   {
     char *argv[] = { (char *) "ld.so", ldconfig_path, (char *) "--help", NULL };
     struct support_capture_subprocess cap
-      = support_capture_subprogram (support_objdir_elf_ldso, argv);
+      = support_capture_subprogram (support_objdir_elf_ldso, argv, NULL);
     support_capture_subprocess_check (&cap, "no --argv0", 0, sc_allow_stdout);
     puts ("info: output without --argv0:");
     puts (cap.out.buffer);
@@ -46,7 +46,7 @@  do_test (void)
         ldconfig_path, (char *) "--help", NULL
       };
     struct support_capture_subprocess cap
-      = support_capture_subprogram (support_objdir_elf_ldso, argv);
+      = support_capture_subprogram (support_objdir_elf_ldso, argv, NULL);
     support_capture_subprocess_check (&cap, "with --argv0", 0, sc_allow_stdout);
     puts ("info: output with --argv0:");
     puts (cap.out.buffer);
diff --git a/elf/tst-tunables-enable_secure.c b/elf/tst-tunables-enable_secure.c
index e31e1f7faa..f5db1c84e9 100644
--- a/elf/tst-tunables-enable_secure.c
+++ b/elf/tst-tunables-enable_secure.c
@@ -113,7 +113,7 @@  do_test (int argc, char *argv[])
       printf ("[%d] Spawned test for %s\n", i, tests[i].env);
       setenv ("GLIBC_TUNABLES", tests[i].env, 1);
       struct support_capture_subprocess result
-	= support_capture_subprogram (spargv[0], spargv);
+	= support_capture_subprogram (spargv[0], spargv, NULL);
       support_capture_subprocess_check (&result, "tst-tunables-enable_secure",
 		                        0, sc_allow_stderr);
       support_capture_subprocess_free (&result);
diff --git a/elf/tst-tunables.c b/elf/tst-tunables.c
index 8f4ee46ad5..a2b3a677e2 100644
--- a/elf/tst-tunables.c
+++ b/elf/tst-tunables.c
@@ -393,7 +393,7 @@  do_test (int argc, char *argv[])
 	      tests[i].value);
       setenv (tests[i].name, tests[i].value, 1);
       struct support_capture_subprocess result
-	= support_capture_subprogram (spargv[0], spargv);
+	= support_capture_subprogram (spargv[0], spargv, NULL);
       support_capture_subprocess_check (&result, "tst-tunables", 0,
 					sc_allow_stderr);
       support_capture_subprocess_free (&result);
diff --git a/support/capture_subprocess.h b/support/capture_subprocess.h
index 1ecbdfe4fc..93b7245d2a 100644
--- a/support/capture_subprocess.h
+++ b/support/capture_subprocess.h
@@ -35,11 +35,12 @@  struct support_capture_subprocess
 struct support_capture_subprocess support_capture_subprocess
   (void (*callback) (void *), void *closure);
 
-/* Issue FILE with ARGV arguments by using posix_spawn and capture standard
-   output, standard error, and the exit status.  The out.buffer and err.buffer
-   are handle as support_capture_subprocess.  */
+/* Issue FILE with ARGV arguments and ENVP environments by using posix_spawn
+   and capture standard output, standard error, and the exit status.  If
+   ENVP is NULL the current environment variable is used.  The out.buffer and
+   err.buffer are handle by support_capture_subprocess.  */
 struct support_capture_subprocess support_capture_subprogram
-  (const char *file, char *const argv[]);
+  (const char *file, char *const argv[], char *const envp[]);
 
 /* Copy the running program into a setgid binary and run it with CHILD_ID
    argument.  If execution is successful, return the exit status of the child
diff --git a/support/subprocess.h b/support/subprocess.h
index 8fbb895353..8274a2b22b 100644
--- a/support/subprocess.h
+++ b/support/subprocess.h
@@ -33,10 +33,11 @@  struct support_subprocess
 struct support_subprocess support_subprocess
   (void (*callback) (void *), void *closure);
 
-/* Issue FILE with ARGV arguments by using posix_spawn and return is PID, a
-   pipe redirected to STDOUT, and a pipe redirected to STDERR.  */
+/* Issue FILE with ARGV arguments and ENVP environments by using posix_spawn
+   and return is PID, a pipe redirected to STDOUT, and a pipe redirected to
+   STDERR.  If ENVP is NULL the current environment variable is used.  */
 struct support_subprocess support_subprogram
-  (const char *file, char *const argv[]);
+  (const char *file, char *const argv[], char *const envp[]);
 
 /* Invoke program FILE with ARGV arguments by using posix_spawn and wait for it
    to complete.  Return program exit status.  */
diff --git a/support/support_capture_subprocess.c b/support/support_capture_subprocess.c
index ffced8a89f..53847194cb 100644
--- a/support/support_capture_subprocess.c
+++ b/support/support_capture_subprocess.c
@@ -93,13 +93,14 @@  support_capture_subprocess (void (*callback) (void *), void *closure)
 }
 
 struct support_capture_subprocess
-support_capture_subprogram (const char *file, char *const argv[])
+support_capture_subprogram (const char *file, char *const argv[],
+			    char *const envp[])
 {
   struct support_capture_subprocess result;
   xopen_memstream (&result.out);
   xopen_memstream (&result.err);
 
-  struct support_subprocess proc = support_subprogram (file, argv);
+  struct support_subprocess proc = support_subprogram (file, argv, envp);
 
   support_capture_poll (&result, &proc);
   return result;
diff --git a/support/support_subprocess.c b/support/support_subprocess.c
index a2fef394d4..b692a7f8b1 100644
--- a/support/support_subprocess.c
+++ b/support/support_subprocess.c
@@ -69,7 +69,7 @@  support_subprocess (void (*callback) (void *), void *closure)
 }
 
 struct support_subprocess
-support_subprogram (const char *file, char *const argv[])
+support_subprogram (const char *file, char *const argv[], char *const envp[])
 {
   struct support_subprocess result = support_subprocess_init ();
 
@@ -84,7 +84,8 @@  support_subprogram (const char *file, char *const argv[])
   xposix_spawn_file_actions_addclose (&fa, result.stdout_pipe[1]);
   xposix_spawn_file_actions_addclose (&fa, result.stderr_pipe[1]);
 
-  result.pid = xposix_spawn (file, &fa, NULL, argv, environ);
+  result.pid = xposix_spawn (file, &fa, NULL, argv,
+			     envp == NULL ? environ : envp);
 
   xclose (result.stdout_pipe[1]);
   xclose (result.stderr_pipe[1]);
diff --git a/support/tst-support_capture_subprocess.c b/support/tst-support_capture_subprocess.c
index 8145548982..756fb75d19 100644
--- a/support/tst-support_capture_subprocess.c
+++ b/support/tst-support_capture_subprocess.c
@@ -238,7 +238,7 @@  do_subprogram (const struct test *test)
   args[argc]   = NULL;
   TEST_VERIFY (argc < argv_size);
 
-  return support_capture_subprogram (args[0], args);
+  return support_capture_subprogram (args[0], args, NULL);
 }
 
 enum test_type
diff --git a/sysdeps/x86/tst-hwcap-tunables.c b/sysdeps/x86/tst-hwcap-tunables.c
index f6a65b88de..8589a9fd66 100644
--- a/sysdeps/x86/tst-hwcap-tunables.c
+++ b/sysdeps/x86/tst-hwcap-tunables.c
@@ -133,7 +133,7 @@  do_test (int argc, char *argv[])
       setenv ("GLIBC_TUNABLES", tunable, 1);
 
       struct support_capture_subprocess result
-	= support_capture_subprogram (spargv[0], spargv);
+	= support_capture_subprogram (spargv[0], spargv, NULL);
       support_capture_subprocess_check (&result, "tst-tunables", 0,
 					sc_allow_stderr);
       support_capture_subprocess_free (&result);