Author: cem
Date: Tue Nov  8 05:31:01 2016
New Revision: 308432
URL: https://svnweb.freebsd.org/changeset/base/308432

Log:
  Capsicumize some trivial stdio programs
  
  Trivially capsicumize some simple programs that just interact with
  stdio.  This list of programs uses 'pledge("stdio")' in OpenBSD.
  
  No objection from:    allanjude, emaste, oshogbo
  Sponsored by: Dell EMC Isilon
  Differential Revision:        https://reviews.freebsd.org/D8307

Modified:
  head/bin/echo/echo.c
  head/bin/sleep/sleep.c
  head/usr.bin/basename/basename.c
  head/usr.bin/dc/dc.c
  head/usr.bin/dirname/dirname.c
  head/usr.bin/fold/fold.c
  head/usr.bin/getopt/getopt.c
  head/usr.bin/locate/bigram/locate.bigram.c
  head/usr.bin/logname/logname.c
  head/usr.bin/printenv/printenv.c
  head/usr.bin/yes/yes.c

Modified: head/bin/echo/echo.c
==============================================================================
--- head/bin/echo/echo.c        Tue Nov  8 00:24:49 2016        (r308431)
+++ head/bin/echo/echo.c        Tue Nov  8 05:31:01 2016        (r308432)
@@ -45,6 +45,8 @@ __FBSDID("$FreeBSD$");
 #include <sys/uio.h>
 
 #include <assert.h>
+#include <capsicum_helpers.h>
+#include <err.h>
 #include <errno.h>
 #include <limits.h>
 #include <stdlib.h>
@@ -78,6 +80,9 @@ main(int argc, char *argv[])
        char newline[] = "\n";
        char *progname = argv[0];
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        /* This utility may NOT do getopt(3) option parsing. */
        if (*++argv && !strcmp(*argv, "-n")) {
                ++argv;

Modified: head/bin/sleep/sleep.c
==============================================================================
--- head/bin/sleep/sleep.c      Tue Nov  8 00:24:49 2016        (r308431)
+++ head/bin/sleep/sleep.c      Tue Nov  8 05:31:01 2016        (r308432)
@@ -41,6 +41,7 @@ static char sccsid[] = "@(#)sleep.c   8.3 
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <capsicum_helpers.h>
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
@@ -69,6 +70,9 @@ main(int argc, char *argv[])
        time_t original;
        char buf[2];
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        if (argc != 2)
                usage();
 

Modified: head/usr.bin/basename/basename.c
==============================================================================
--- head/usr.bin/basename/basename.c    Tue Nov  8 00:24:49 2016        
(r308431)
+++ head/usr.bin/basename/basename.c    Tue Nov  8 05:31:01 2016        
(r308432)
@@ -42,6 +42,7 @@ static char sccsid[] = "@(#)basename.c        8
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <capsicum_helpers.h>
 #include <err.h>
 #include <libgen.h>
 #include <limits.h>
@@ -64,6 +65,9 @@ main(int argc, char **argv)
 
        setlocale(LC_ALL, "");
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        aflag = 0;
        suffix = NULL;
        suffixlen = 0;

Modified: head/usr.bin/dc/dc.c
==============================================================================
--- head/usr.bin/dc/dc.c        Tue Nov  8 00:24:49 2016        (r308431)
+++ head/usr.bin/dc/dc.c        Tue Nov  8 05:31:01 2016        (r308432)
@@ -22,9 +22,11 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/stat.h>
 
+#include <capsicum_helpers.h>
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <getopt.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -58,11 +60,11 @@ usage(void)
 }
 
 static void
-procfile(char *fname) {
+procfd(int fd, char *fname) {
        struct stat st;
        FILE *file;
 
-       file = fopen(fname, "r");
+       file = fdopen(fd, "r");
        if (file == NULL)
                err(1, "cannot open file %s", fname);
        if (fstat(fileno(file), &st) == -1)
@@ -80,7 +82,7 @@ procfile(char *fname) {
 int
 main(int argc, char *argv[])
 {
-       int ch;
+       int ch, fd;
        bool extended_regs = false, preproc_done = false;
 
        /* accept and ignore a single dash to be 4.4BSD dc(1) compatible */
@@ -97,7 +99,10 @@ main(int argc, char *argv[])
                case 'f':
                        if (!preproc_done)
                                init_bmachine(extended_regs);
-                       procfile(optarg);
+                       fd = open(optarg, O_RDONLY);
+                       if (fd < 0)
+                               err(1, "cannot open file %s", optarg);
+                       procfd(fd, optarg);
                        preproc_done = true;
                        break;
                case 'x':
@@ -126,12 +131,23 @@ main(int argc, char *argv[])
        if (argc > 1)
                usage();
        if (argc == 1) {
-               procfile(argv[0]);
+               fd = open(argv[0], O_RDONLY);
+               if (fd < 0)
+                       err(1, "cannot open file %s", argv[0]);
+
+               if (caph_limit_stream(fd, CAPH_READ) < 0 ||
+                   caph_limit_stdio() < 0 ||
+                   (cap_enter() < 0 && errno != ENOSYS))
+                       err(1, "capsicum");
+
+               procfd(fd, argv[0]);
                preproc_done = true;
        }
        if (preproc_done)
                return (0);
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
        src_setstream(&src, stdin);
        reset_bmachine(&src);
        eval();

Modified: head/usr.bin/dirname/dirname.c
==============================================================================
--- head/usr.bin/dirname/dirname.c      Tue Nov  8 00:24:49 2016        
(r308431)
+++ head/usr.bin/dirname/dirname.c      Tue Nov  8 05:31:01 2016        
(r308432)
@@ -39,6 +39,7 @@ static const char sccsid[] = "@(#)dirnam
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <capsicum_helpers.h>
 #include <err.h>
 #include <libgen.h>
 #include <stdio.h>
@@ -53,6 +54,9 @@ main(int argc, char **argv)
        char *p;
        int ch;
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        while ((ch = getopt(argc, argv, "")) != -1)
                switch(ch) {
                case '?':

Modified: head/usr.bin/fold/fold.c
==============================================================================
--- head/usr.bin/fold/fold.c    Tue Nov  8 00:24:49 2016        (r308431)
+++ head/usr.bin/fold/fold.c    Tue Nov  8 05:31:01 2016        (r308432)
@@ -45,6 +45,7 @@ static char sccsid[] = "@(#)fold.c    8.1 (
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <capsicum_helpers.h>
 #include <err.h>
 #include <limits.h>
 #include <locale.h>
@@ -72,6 +73,9 @@ main(int argc, char **argv)
 
        (void) setlocale(LC_CTYPE, "");
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        width = -1;
        previous_ch = 0;
        while ((ch = getopt(argc, argv, "0123456789bsw:")) != -1) {

Modified: head/usr.bin/getopt/getopt.c
==============================================================================
--- head/usr.bin/getopt/getopt.c        Tue Nov  8 00:24:49 2016        
(r308431)
+++ head/usr.bin/getopt/getopt.c        Tue Nov  8 05:31:01 2016        
(r308432)
@@ -6,6 +6,9 @@ __FBSDID("$FreeBSD$");
  * into the public domain and is thus not subject to any copyright.
  */
 
+#include <capsicum_helpers.h>
+#include <err.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -16,6 +19,9 @@ main(int argc, char *argv[])
        int c;
        int status = 0;
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        optind = 2;     /* Past the program name and the option letters. */
        while ((c = getopt(argc, argv, argv[1])) != -1)
                switch (c) {

Modified: head/usr.bin/locate/bigram/locate.bigram.c
==============================================================================
--- head/usr.bin/locate/bigram/locate.bigram.c  Tue Nov  8 00:24:49 2016        
(r308431)
+++ head/usr.bin/locate/bigram/locate.bigram.c  Tue Nov  8 05:31:01 2016        
(r308432)
@@ -57,6 +57,9 @@ static char sccsid[] = "@(#)locate.bigra
  * Use 'code' to encode a file using this output.
  */
 
+#include <capsicum_helpers.h>
+#include <err.h>
+#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <sys/param.h>                 /* for MAXPATHLEN */
@@ -73,6 +76,9 @@ main(void)
        u_char *oldpath = buf1, *path = buf2;
        u_int i, j;
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        while (fgets(path, sizeof(buf2), stdin) != NULL) {
 
                /* 

Modified: head/usr.bin/logname/logname.c
==============================================================================
--- head/usr.bin/logname/logname.c      Tue Nov  8 00:24:49 2016        
(r308431)
+++ head/usr.bin/logname/logname.c      Tue Nov  8 05:31:01 2016        
(r308432)
@@ -39,6 +39,7 @@ static const char sccsid[] = "@(#)lognam
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <capsicum_helpers.h>
 #include <err.h>
 #include <unistd.h>
 #include <stdio.h>
@@ -51,6 +52,9 @@ main(int argc, char *argv[] __unused)
 {
        char *p;
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        if (argc != 1)
                usage();
        if ((p = getlogin()) == NULL)

Modified: head/usr.bin/printenv/printenv.c
==============================================================================
--- head/usr.bin/printenv/printenv.c    Tue Nov  8 00:24:49 2016        
(r308431)
+++ head/usr.bin/printenv/printenv.c    Tue Nov  8 05:31:01 2016        
(r308432)
@@ -44,6 +44,8 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/types.h>
 
+#include <capsicum_helpers.h>
+#include <err.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -65,6 +67,9 @@ main(int argc, char *argv[])
        size_t len;
        int ch;
 
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        while ((ch = getopt(argc, argv, "")) != -1)
                switch(ch) {
                case '?':

Modified: head/usr.bin/yes/yes.c
==============================================================================
--- head/usr.bin/yes/yes.c      Tue Nov  8 00:24:49 2016        (r308431)
+++ head/usr.bin/yes/yes.c      Tue Nov  8 05:31:01 2016        (r308432)
@@ -41,12 +41,17 @@ static const char rcsid[] = "$FreeBSD$";
 #endif
 #endif /* not lint */
 
+#include <capsicum_helpers.h>
 #include <err.h>
 #include <stdio.h>
 
 int
 main(int argc, char **argv)
 {
+
+       if (caph_limit_stdio() < 0 || (cap_enter() < 0 && errno != ENOSYS))
+               err(1, "capsicum");
+
        if (argc > 1)
                while (puts(argv[1]) != EOF)
                        ;
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to