On Sun, Aug 30, 2015 at 08:01:02PM +0200, Fritjof Bornebusch wrote:
> 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.
>
New diff with help from tobias@, as theo@ pointed me to a downside.
> --F.
>
Index: cat/cat.c
===================================================================
RCS file: /cvs/src/bin/cat/cat.c,v
retrieving revision 1.21
diff -u -p -r1.21 cat.c
--- cat/cat.c 16 Jan 2015 06:39:28 -0000 1.21
+++ cat/cat.c 31 Aug 2015 20:44:20 -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
Index: chio/chio.c
===================================================================
RCS file: /cvs/src/bin/chio/chio.c,v
retrieving revision 1.25
diff -u -p -r1.25 chio.c
--- chio/chio.c 16 Mar 2014 18:38:30 -0000 1.25
+++ chio/chio.c 31 Aug 2015 20:44:21 -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/chmod.c
===================================================================
RCS file: /cvs/src/bin/chmod/chmod.c,v
retrieving revision 1.34
diff -u -p -r1.34 chmod.c
--- chmod/chmod.c 25 Jun 2015 02:04:08 -0000 1.34
+++ chmod/chmod.c 31 Aug 2015 20:44:22 -0000
@@ -279,7 +279,7 @@ done:
if (errno)
err(1, "fts_read");
fts_close(ftsp);
- exit(rval);
+ return (rval);
}
/*
Index: cp/cp.c
===================================================================
RCS file: /cvs/src/bin/cp/cp.c,v
retrieving revision 1.38
diff -u -p -r1.38 cp.c
--- cp/cp.c 7 May 2015 17:32:20 -0000 1.38
+++ cp/cp.c 31 Aug 2015 20:44:22 -0000
@@ -224,7 +224,7 @@ main(int argc, char *argv[])
type = FILE_TO_DIR;
}
- exit(copy(argv, type, fts_options));
+ return (copy(argv, type, fts_options));
}
char *
Index: date/date.c
===================================================================
RCS file: /cvs/src/bin/date/date.c,v
retrieving revision 1.47
diff -u -p -r1.47 date.c
--- date/date.c 17 Apr 2015 16:47:47 -0000 1.47
+++ date/date.c 31 Aug 2015 20:44:22 -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/dd.c
===================================================================
RCS file: /cvs/src/bin/dd/dd.c,v
retrieving revision 1.21
diff -u -p -r1.21 dd.c
--- dd/dd.c 16 Jan 2015 06:39:31 -0000 1.21
+++ dd/dd.c 31 Aug 2015 20:44:22 -0000
@@ -85,7 +85,7 @@ main(int argc, char *argv[])
}
dd_close();
- exit(0);
+ return (0);
}
static void
Index: df/df.c
===================================================================
RCS file: /cvs/src/bin/df/df.c,v
retrieving revision 1.52
diff -u -p -r1.52 df.c
--- df/df.c 16 Jan 2015 06:39:31 -0000 1.52
+++ df/df.c 31 Aug 2015 20:44:23 -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/domainname.c
===================================================================
RCS file: /cvs/src/bin/domainname/domainname.c,v
retrieving revision 1.9
diff -u -p -r1.9 domainname.c
--- domainname/domainname.c 16 Jan 2015 06:39:31 -0000 1.9
+++ domainname/domainname.c 31 Aug 2015 20:44:23 -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/expr.c
===================================================================
RCS file: /cvs/src/bin/expr/expr.c,v
retrieving revision 1.20
diff -u -p -r1.20 expr.c
--- expr/expr.c 11 Aug 2015 17:15:46 -0000 1.20
+++ expr/expr.c 31 Aug 2015 20:44:23 -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/hostname.c
===================================================================
RCS file: /cvs/src/bin/hostname/hostname.c,v
retrieving revision 1.9
diff -u -p -r1.9 hostname.c
--- hostname/hostname.c 16 Jan 2015 06:39:32 -0000 1.9
+++ hostname/hostname.c 31 Aug 2015 20:44:23 -0000
@@ -72,7 +72,7 @@ main(int argc, char *argv[])
*p = '\0';
(void)printf("%s\n", hostname);
}
- exit(0);
+ return (0);
}
void
Index: kill/kill.c
===================================================================
RCS file: /cvs/src/bin/kill/kill.c,v
retrieving revision 1.12
diff -u -p -r1.12 kill.c
--- kill/kill.c 23 Mar 2014 12:44:00 -0000 1.12
+++ kill/kill.c 31 Aug 2015 20:44:23 -0000
@@ -126,7 +126,7 @@ main(int argc, char *argv[])
}
}
- exit(errors);
+ return (errors);
}
int
Index: ln/ln.c
===================================================================
RCS file: /cvs/src/bin/ln/ln.c,v
retrieving revision 1.22
diff -u -p -r1.22 ln.c
--- ln/ln.c 16 Jan 2015 06:39:32 -0000 1.22
+++ ln/ln.c 31 Aug 2015 20:44:24 -0000
@@ -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/mkdir.c
===================================================================
RCS file: /cvs/src/bin/mkdir/mkdir.c,v
retrieving revision 1.25
diff -u -p -r1.25 mkdir.c
--- mkdir/mkdir.c 2 Apr 2013 20:26:17 -0000 1.25
+++ mkdir/mkdir.c 31 Aug 2015 20:44:24 -0000
@@ -112,7 +112,7 @@ main(int argc, char *argv[])
exitval = 1;
}
}
- exit(exitval);
+ return (exitval);
}
/*
Index: mt/mt.c
===================================================================
RCS file: /cvs/src/bin/mt/mt.c,v
retrieving revision 1.36
diff -u -p -r1.36 mt.c
--- mt/mt.c 12 Nov 2013 04:36:02 -0000 1.36
+++ mt/mt.c 31 Aug 2015 20:44:24 -0000
@@ -243,8 +243,7 @@ main(int argc, char *argv[])
_rmtclose();
- exit(X_FINOK);
- /* NOTREACHED */
+ return (X_FINOK);
}
struct tape_desc {
Index: mv/mv.c
===================================================================
RCS file: /cvs/src/bin/mv/mv.c,v
retrieving revision 1.40
diff -u -p -r1.40 mv.c
--- mv/mv.c 24 Aug 2015 00:10:59 -0000 1.40
+++ mv/mv.c 31 Aug 2015 20:44:24 -0000
@@ -143,7 +143,7 @@ main(int argc, char *argv[])
rval = 1;
}
}
- exit(rval);
+ return (rval);
}
int
Index: ps/ps.c
===================================================================
RCS file: /cvs/src/bin/ps/ps.c,v
retrieving revision 1.65
diff -u -p -r1.65 ps.c
--- ps/ps.c 29 Jun 2015 15:03:33 -0000 1.65
+++ ps/ps.c 31 Aug 2015 20:44:24 -0000
@@ -367,7 +367,7 @@ main(int argc, char *argv[])
lineno = 0;
}
}
- exit(eval);
+ return (eval);
}
static void
Index: pwd/pwd.c
===================================================================
RCS file: /cvs/src/bin/pwd/pwd.c,v
retrieving revision 1.12
diff -u -p -r1.12 pwd.c
--- pwd/pwd.c 28 May 2014 06:55:58 -0000 1.12
+++ pwd/pwd.c 31 Aug 2015 20:44:24 -0000
@@ -77,7 +77,7 @@ main(int argc, char *argv[])
puts(p);
- exit(EXIT_SUCCESS);
+ return (0);
}
static char *
Index: rm/rm.c
===================================================================
RCS file: /cvs/src/bin/rm/rm.c,v
retrieving revision 1.30
diff -u -p -r1.30 rm.c
--- rm/rm.c 16 Jan 2015 06:39:32 -0000 1.30
+++ rm/rm.c 31 Aug 2015 20:44:26 -0000
@@ -116,7 +116,7 @@ main(int argc, char *argv[])
rm_file(argv);
}
- exit (eval);
+ return (eval);
}
void
Index: systrace/systrace.c
===================================================================
RCS file: /cvs/src/bin/systrace/systrace.c,v
retrieving revision 1.63
diff -u -p -r1.63 systrace.c
--- systrace/systrace.c 18 Apr 2015 18:28:37 -0000 1.63
+++ systrace/systrace.c 31 Aug 2015 20:44:26 -0000
@@ -822,5 +822,5 @@ main(int argc, char **argv)
close(trfd);
- exit(0);
+ return (0);
}