From: Jim Meyering Date: Sun, 15 Nov 2009 21:23:01 +0000 (+0100) Subject: true, false: perform initialization only when argc == 2 X-Git-Tag: v8.1~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=161e5120d4c586950ad6a110baa039ab11af1038;p=thirdparty%2Fcoreutils.git 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 ' '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. --- diff --git a/src/true.c b/src/true.c index f3e937f5a9..d9d0118c2e 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);