diff options
author | Florian Weimer <fweimer@redhat.com> | 2012-07-31 09:55:38 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2012-07-31 09:55:38 +0200 |
commit | 2bc1387273d2123398fc12133643ea2bc02a2cd1 (patch) | |
tree | 948b6ffa11294e3abec2f4d41c5e53b0147acc40 /stdlib | |
parent | bea9b19322c77265033a068ac60c95a37e798a80 (diff) | |
download | glibc-2bc1387273d2123398fc12133643ea2bc02a2cd1.zip glibc-2bc1387273d2123398fc12133643ea2bc02a2cd1.tar.gz glibc-2bc1387273d2123398fc12133643ea2bc02a2cd1.tar.bz2 |
secure_getenv test should write errors to standard output
This way, they end up in the log file. Also skip the test if no GID can
be found.
Diffstat (limited to 'stdlib')
-rw-r--r-- | stdlib/tst-secure-getenv.c | 55 |
1 files changed, 28 insertions, 27 deletions
diff --git a/stdlib/tst-secure-getenv.c b/stdlib/tst-secure-getenv.c index 76d8de6..276b0af 100644 --- a/stdlib/tst-secure-getenv.c +++ b/stdlib/tst-secure-getenv.c @@ -45,7 +45,7 @@ choose_gid (void) int ret = getgroups (count, groups); if (ret < 0) { - perror ("getgroups"); + printf ("getgroups: %m\n"); exit (1); } gid_t current = getgid (); @@ -72,29 +72,29 @@ run_executable_sgid (gid_t target) if (asprintf (&dirname, "%s/secure-getenv.%jd", test_dir, (intmax_t) getpid ()) < 0) { - perror ("asprintf"); + printf ("asprintf: %m\n"); goto err; } if (mkdir (dirname, 0700) < 0) { - perror ("mkdir"); + printf ("mkdir: %m\n"); goto err; } if (asprintf (&execname, "%s/bin", dirname) < 0) { - perror ("asprintf"); + printf ("asprintf: %m\n"); goto err; } infd = open ("/proc/self/exe", O_RDONLY); if (infd < 0) { - perror ("open"); + printf ("open (/proc/self/exe): %m\n"); goto err; } outfd = open (execname, O_WRONLY | O_CREAT | O_EXCL, 0700); if (outfd < 0) { - perror ("open"); + printf ("open (%s): %m\n", execname); goto err; } char buf[4096]; @@ -103,7 +103,7 @@ run_executable_sgid (gid_t target) ssize_t rdcount = read (infd, buf, sizeof (buf)); if (rdcount < 0) { - perror ("read"); + printf ("read: %m\n"); goto err; } if (rdcount == 0) @@ -117,7 +117,7 @@ run_executable_sgid (gid_t target) errno = ENOSPC; if (wrcount <= 0) { - perror ("write"); + printf ("write: %m\n"); goto err; } p += wrcount; @@ -125,29 +125,29 @@ run_executable_sgid (gid_t target) } if (fchown (outfd, getuid (), target) < 0) { - perror ("fchown"); + printf ("fchown (%s): %m\n", execname); goto err; } if (fchmod (outfd, 02750) < 0) { - perror ("fchmod"); + printf ("fchmod (%s): %m\n", execname); goto err; } if (close (outfd) < 0) { - perror ("close"); + printf ("close (outfd): %m\n"); goto err; } if (close (infd) < 0) { - perror ("close"); + printf ("close (infd): %m\n"); goto err; } int kid = fork (); if (kid < 0) { - perror ("fork"); + printf ("fork: %m\n"); goto err; } if (kid == 0) @@ -155,19 +155,19 @@ run_executable_sgid (gid_t target) /* Child process. */ char *args[] = { execname, MAGIC_ARGUMENT, NULL }; execve (execname, args, environ); - perror ("execve"); + printf ("execve (%s): %m\n", execname); _exit (1); } int status; if (waitpid (kid, &status, 0) < 0) { - perror ("waitpid"); + printf ("waitpid: %m\n"); goto err; } if (!WIFEXITED (status) || WEXITSTATUS (status) != MAGIC_STATUS) { - fprintf (stderr, "Unexpected exit status %d from child process\n", - status); + printf ("Unexpected exit status %d from child process\n", + status); goto err; } ret = 0; @@ -195,27 +195,28 @@ do_test (void) { if (getenv ("PATH") == NULL) { - fprintf (stderr, "PATH not set\n"); + printf ("PATH not set\n"); exit (1); } if (secure_getenv ("PATH") == NULL) { - fprintf (stderr, "PATH not set according to secure_getenv\n"); + printf ("PATH not set according to secure_getenv\n"); exit (1); } if (strcmp (getenv ("PATH"), secure_getenv ("PATH")) != 0) { - fprintf (stderr, "PATH mismatch (%s, %s)\n", - getenv ("PATH"), secure_getenv ("PATH")); + printf ("PATH mismatch (%s, %s)\n", + getenv ("PATH"), secure_getenv ("PATH")); exit (1); } gid_t target = choose_gid (); if (target == 0) { - fprintf (stderr, "Could not find a suitable GID user %jd\n", + fprintf (stderr, + "Could not find a suitable GID for user %jd, skipping test\n", (intmax_t) getuid ()); - exit (1); + exit (0); } return run_executable_sgid (target); } @@ -227,18 +228,18 @@ alternative_main (int argc, char **argv) { if (getgid () == getegid ()) { - fprintf (stderr, "SGID failed: GID and EGID match (%jd)\n", - (intmax_t) getgid ()); + printf ("SGID failed: GID and EGID match (%jd)\n", + (intmax_t) getgid ()); exit (2); } if (getenv ("PATH") == NULL) { - fprintf (stderr, "PATH variable not present\n"); + printf ("PATH variable not present\n"); exit (3); } if (secure_getenv ("PATH") != NULL) { - fprintf (stderr, "PATH variable not filtered out\n"); + printf ("PATH variable not filtered out\n"); exit (4); } exit (MAGIC_STATUS); |