summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Meyering <meyering@redhat.com>2009-11-15 22:23:01 +0100
committerJim Meyering <meyering@redhat.com>2009-11-16 09:30:50 +0100
commit161e5120d4c586950ad6a110baa039ab11af1038 (patch)
tree250f02d4ad225a8d1dcc8cedd3df0f9ec7415700
parent3b997a9bcb05198c880e5d1605a3c96c1d7f9c5d (diff)
downloadcoreutils-161e5120d4c586950ad6a110baa039ab11af1038.tar.gz
coreutils-161e5120d4c586950ad6a110baa039ab11af1038.tar.bz2
coreutils-161e5120d4c586950ad6a110baa039ab11af1038.zip
true, false: perform initialization only when argc == 2
* src/true.c (main): There is no reason to examine argv[0], call atexit, etc., in the usual case in which we're about to exit. This has the side effect of making it so that these programs no longer segfault when subjected to execve abuse. Before this change, these commands would make "true" segfault: printf '%s\n' '#include <unistd.h>' 'int main(int c, char**v)' \ '{ execve (v[1], 0, 0); }' > k.c && gcc k.c && ./a.out $PWD/true Now it succeeds. Reported by Tetsuo Handa and Bart Van Assche via Ondřej Vašík in http://bugzilla.redhat.com/537684.
-rw-r--r--src/true.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/true.c b/src/true.c
index f3e937f5a..d9d0118c2 100644
--- a/src/true.c
+++ b/src/true.c
@@ -54,18 +54,18 @@ Usage: %s [ignored command line arguments]\n\
int
main (int argc, char **argv)
{
- initialize_main (&argc, &argv);
- set_program_name (argv[0]);
- setlocale (LC_ALL, "");
- bindtextdomain (PACKAGE, LOCALEDIR);
- textdomain (PACKAGE);
-
- atexit (close_stdout);
-
/* Recognize --help or --version only if it's the only command-line
argument. */
if (argc == 2)
{
+ initialize_main (&argc, &argv);
+ set_program_name (argv[0]);
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ atexit (close_stdout);
+
if (STREQ (argv[1], "--help"))
usage (EXIT_STATUS);