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

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

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Testing passed
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Testing passed

Commit Message

Adhemerval Zanella Netto April 30, 2024, 7:25 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

Joe Simmons-Talbott April 30, 2024, 8:06 p.m. UTC | #1
On Tue, Apr 30, 2024 at 3:33 PM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:

A few minor typos follow.

>
> So tests can specific a list of environment variables.

s/specific/specify/

> ---
>  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 ce5f62f777..7afd76fb9b 100644
> --- a/elf/tst-tunables.c
> +++ b/elf/tst-tunables.c
> @@ -394,7 +394,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..d69d1afe65 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 usued.  The out.buffer and

s/usued/used/

> +   err.buffer are handle as support_capture_subprocess.  */

s/handle as/handled by/ ?

>  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..c7ac6d6536 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 usued.  */

s/usued/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);
> --
> 2.43.0
>
  

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 ce5f62f777..7afd76fb9b 100644
--- a/elf/tst-tunables.c
+++ b/elf/tst-tunables.c
@@ -394,7 +394,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..d69d1afe65 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 usued.  The out.buffer and
+   err.buffer are handle as 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..c7ac6d6536 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 usued.  */
 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);