As suggested by deraadt@ and tobias@ it might be better to use the *return* 
statement instead of exit(3) 
inside the *main* function, to let the stack protector do its work.

This diff removes such calls in all *src/bin/* tools, except those who already 
use it.
I think I didn't miss a call and didn't introduce any bugs.

--F.

Index: chio.c
===================================================================
RCS file: /cvs/src/bin/chio/chio.c,v
retrieving revision 1.25
diff -u -p -r1.25 chio.c
--- chio.c      16 Mar 2014 18:38:30 -0000      1.25
+++ chio.c      30 Aug 2015 16:52:27 -0000
@@ -148,7 +148,7 @@ main(int argc, char *argv[])
        if (commands[i].cc_name == NULL)
                errx(1, "unknown command: %s", *argv);
 
-       exit((*commands[i].cc_handler)(commands[i].cc_name, argc, argv));
+       return ((*commands[i].cc_handler)(commands[i].cc_name, argc, argv));
 }
 
 static int
Index: chmod.c
===================================================================
RCS file: /cvs/src/bin/chmod/chmod.c,v
retrieving revision 1.34
diff -u -p -r1.34 chmod.c
--- chmod.c     25 Jun 2015 02:04:08 -0000      1.34
+++ chmod.c     30 Aug 2015 16:58:54 -0000
@@ -279,7 +279,7 @@ done:
        if (errno)
                err(1, "fts_read");
        fts_close(ftsp);
-       exit(rval);
+       return (rval);
 }
 
 /*
Index: date.c
===================================================================
RCS file: /cvs/src/bin/date/date.c,v
retrieving revision 1.47
diff -u -p -r1.47 date.c
--- date.c      17 Apr 2015 16:47:47 -0000      1.47
+++ date.c      30 Aug 2015 17:04:57 -0000
@@ -143,7 +143,7 @@ main(int argc, char *argv[])
                errx(1, "conversion error");
        (void)strftime(buf, sizeof(buf), format, tp);
        (void)printf("%s\n", buf);
-       exit(0);
+       return (0);
 }
 
 #define        ATOI2(ar)       ((ar) += 2, ((ar)[-2] - '0') * 10 + ((ar)[-1] - 
'0'))
Index: dd.c
===================================================================
RCS file: /cvs/src/bin/dd/dd.c,v
retrieving revision 1.21
diff -u -p -r1.21 dd.c
--- dd.c        16 Jan 2015 06:39:31 -0000      1.21
+++ dd.c        30 Aug 2015 17:07:35 -0000
@@ -85,7 +85,7 @@ main(int argc, char *argv[])
        }
 
        dd_close();
-       exit(0);
+       return (0);
 }
 
 static void
Index: df.c
===================================================================
RCS file: /cvs/src/bin/df/df.c,v
retrieving revision 1.52
diff -u -p -r1.52 df.c
--- df.c        16 Jan 2015 06:39:31 -0000      1.52
+++ df.c        30 Aug 2015 17:09:25 -0000
@@ -175,7 +175,7 @@ main(int argc, char *argv[])
                        bsdprint(mntbuf, mntsize, maxwidth);
        }
 
-       exit(mntsize ? 0 : 1);
+       return (mntsize ? 0 : 1);
 }
 
 char *
Index: domainname.c
===================================================================
RCS file: /cvs/src/bin/domainname/domainname.c,v
retrieving revision 1.9
diff -u -p -r1.9 domainname.c
--- domainname.c        16 Jan 2015 06:39:31 -0000      1.9
+++ domainname.c        30 Aug 2015 17:11:29 -0000
@@ -66,7 +66,7 @@ main(int argc, char *argv[])
                        err(1, "getdomainname");
                (void)printf("%s\n", domainname);
        }
-       exit(0);
+       return (0);
 }
 
 void
Index: expr.c
===================================================================
RCS file: /cvs/src/bin/expr/expr.c,v
retrieving revision 1.20
diff -u -p -r1.20 expr.c
--- expr.c      11 Aug 2015 17:15:46 -0000      1.20
+++ expr.c      30 Aug 2015 17:18:27 -0000
@@ -518,5 +518,5 @@ main(int argc, char *argv[])
        else
                printf("%s\n", vp->u.s);
 
-       exit(is_zero_or_null(vp));
+       return (is_zero_or_null(vp));
 }
Index: hostname.c
===================================================================
RCS file: /cvs/src/bin/hostname/hostname.c,v
retrieving revision 1.9
diff -u -p -r1.9 hostname.c
--- hostname.c  16 Jan 2015 06:39:32 -0000      1.9
+++ hostname.c  30 Aug 2015 17:19:29 -0000
@@ -72,7 +72,7 @@ main(int argc, char *argv[])
                        *p = '\0';
                (void)printf("%s\n", hostname);
        }
-       exit(0);
+       return (0);
 }
 
 void
Index: kill.c
===================================================================
RCS file: /cvs/src/bin/kill/kill.c,v
retrieving revision 1.12
diff -u -p -r1.12 kill.c
--- kill.c      23 Mar 2014 12:44:00 -0000      1.12
+++ kill.c      30 Aug 2015 17:22:55 -0000
@@ -74,10 +74,10 @@ main(int argc, char *argv[])
                        if (numsig <= 0 || numsig >= NSIG)
                                nosig(*argv);
                        printf("%s\n", sys_signame[numsig]);
-                       exit(0);
+                       return (0);
                }
                printsignals(stdout);
-               exit(0);
+               return (0);
        }
 
        if (!strcmp(*argv, "-s")) {
@@ -126,7 +126,7 @@ main(int argc, char *argv[])
                }
        }
 
-       exit(errors);
+       return (errors);
 }
 
 int
Index: ln.c
===================================================================
RCS file: /cvs/src/bin/ln/ln.c,v
retrieving revision 1.22
diff -u -p -r1.22 ln.c
--- ln.c        16 Jan 2015 06:39:32 -0000      1.22
+++ ln.c        30 Aug 2015 17:25:52 -0000
@@ -87,9 +87,9 @@ main(int argc, char *argv[])
        case 0:
                usage();
        case 1:                         /* ln target */
-               exit(linkit(argv[0], ".", 1));
+               return (linkit(argv[0], ".", 1));
        case 2:                         /* ln target source */
-               exit(linkit(argv[0], argv[1], 0));
+               return (linkit(argv[0], argv[1], 0));
        }
                                        /* ln target1 target2 directory */
        sourcedir = argv[argc - 1];
@@ -99,7 +99,7 @@ main(int argc, char *argv[])
                usage();
        for (exitval = 0; *argv != sourcedir; ++argv)
                exitval |= linkit(*argv, sourcedir, 1);
-       exit(exitval);
+       return (exitval);
 }
 
  /*
Index: mkdir.c
===================================================================
RCS file: /cvs/src/bin/mkdir/mkdir.c,v
retrieving revision 1.25
diff -u -p -r1.25 mkdir.c
--- mkdir.c     2 Apr 2013 20:26:17 -0000       1.25
+++ mkdir.c     30 Aug 2015 17:28:18 -0000
@@ -112,7 +112,7 @@ main(int argc, char *argv[])
                        exitval = 1;
                }
        }
-       exit(exitval);
+       return (exitval);
 }
 
 /*
Index: mt.c
===================================================================
RCS file: /cvs/src/bin/mt/mt.c,v
retrieving revision 1.36
diff -u -p -r1.36 mt.c
--- mt.c        12 Nov 2013 04:36:02 -0000      1.36
+++ mt.c        30 Aug 2015 17:30:17 -0000
@@ -220,7 +220,7 @@ main(int argc, char *argv[])
        if ((mtfd = _rmtopendev(tape, flags, OPENDEV_PART, &realtape)) < 0) {
                if (errno != 0)
                        warn("%s", host ? tape : realtape);
-               exit(2);
+               return (2);
        }
        if (comp->c_code != MTNOP) {
                mt_com.mt_op = comp->c_code;
@@ -243,8 +243,7 @@ main(int argc, char *argv[])
 
        _rmtclose();
 
-       exit(X_FINOK);
-       /* NOTREACHED */
+       return (X_FINOK);
 }
 
 struct tape_desc {
Index: mv.c
===================================================================
RCS file: /cvs/src/bin/mv/mv.c,v
retrieving revision 1.40
diff -u -p -r1.40 mv.c
--- mv.c        24 Aug 2015 00:10:59 -0000      1.40
+++ mv.c        30 Aug 2015 17:32:47 -0000
@@ -98,7 +98,7 @@ main(int argc, char *argv[])
        if (stat(argv[argc - 1], &sb) || !S_ISDIR(sb.st_mode)) {
                if (argc > 2)
                        usage();
-               exit(do_move(argv[0], argv[1]));
+               return (do_move(argv[0], argv[1]));
        }
 
        /* It's a directory, move each file into it. */
@@ -143,7 +143,7 @@ main(int argc, char *argv[])
                                rval = 1;
                }
        }
-       exit(rval);
+       return (rval);
 }
 
 int
Index: ps.c
===================================================================
RCS file: /cvs/src/bin/ps/ps.c,v
retrieving revision 1.65
diff -u -p -r1.65 ps.c
--- ps.c        29 Jun 2015 15:03:33 -0000      1.65
+++ ps.c        30 Aug 2015 17:35:15 -0000
@@ -334,7 +334,7 @@ main(int argc, char *argv[])
         */
        printheader();
        if (nentries == 0)
-               exit(1);
+               return (1);
        /*
         * sort proc list, we convert from an array of structs to an array
         * of pointers to make the sort cheaper.
@@ -367,7 +367,7 @@ main(int argc, char *argv[])
                        lineno = 0;
                }
        }
-       exit(eval);
+       return (eval);
 }
 
 static void
Index: pwd.c
===================================================================
RCS file: /cvs/src/bin/pwd/pwd.c,v
retrieving revision 1.12
diff -u -p -r1.12 pwd.c
--- pwd.c       28 May 2014 06:55:58 -0000      1.12
+++ pwd.c       30 Aug 2015 17:36:42 -0000
@@ -77,7 +77,7 @@ main(int argc, char *argv[])
 
        puts(p);
 
-       exit(EXIT_SUCCESS);
+       return (EXIT_SUCCESS);
 }
 
 static char *
Index: rm.c
===================================================================
RCS file: /cvs/src/bin/rm/rm.c,v
retrieving revision 1.30
diff -u -p -r1.30 rm.c
--- rm.c        16 Jan 2015 06:39:32 -0000      1.30
+++ rm.c        30 Aug 2015 17:37:44 -0000
@@ -116,7 +116,7 @@ main(int argc, char *argv[])
                        rm_file(argv);
        }
 
-       exit (eval);
+       return (eval);
 }
 
 void
Index: systrace.c
===================================================================
RCS file: /cvs/src/bin/systrace/systrace.c,v
retrieving revision 1.63
diff -u -p -r1.63 systrace.c
--- systrace.c  18 Apr 2015 18:28:37 -0000      1.63
+++ systrace.c  30 Aug 2015 17:41:04 -0000
@@ -748,7 +748,7 @@ main(int argc, char **argv)
        systrace_initcb();
 
        if ((trfd = intercept_open()) == -1)
-               exit(1);
+               return (1);
 
        /* See if we can run the systrace process in the background */
        background = usex11 || automatic || allow;
@@ -822,5 +822,5 @@ main(int argc, char **argv)
 
        close(trfd);
 
-       exit(0);
+       return (0);
 }
Index: cat.c
===================================================================
RCS file: /cvs/src/bin/cat/cat.c,v
retrieving revision 1.21
diff -u -p -r1.21 cat.c
--- cat.c       16 Jan 2015 06:39:28 -0000      1.21
+++ cat.c       30 Aug 2015 17:55:12 -0000
@@ -103,8 +103,7 @@ main(int argc, char *argv[])
                raw_args(argv);
        if (fclose(stdout))
                err(1, "stdout");
-       exit(rval);
-       /* NOTREACHED */
+       return (rval);
 }
 
 void

Reply via email to