Author: cem
Date: Fri Dec 16 01:51:12 2016
New Revision: 310141
URL: https://svnweb.freebsd.org/changeset/base/310141

Log:
  ministat(1): Capsicumify
  
  Separate dataset opening from reading/parsing. The number of input
  files is already capped to a small number, so just open all input files
  before sandboxing.
  
  Feedback from:        allanjude@ (earlier version), emaste@ (earlier version)
  Sponsored by: Dell EMC Isilon
  Differential Revision:        https://reviews.freebsd.org/D7925

Modified:
  head/usr.bin/ministat/ministat.c

Modified: head/usr.bin/ministat/ministat.c
==============================================================================
--- head/usr.bin/ministat/ministat.c    Fri Dec 16 01:48:55 2016        
(r310140)
+++ head/usr.bin/ministat/ministat.c    Fri Dec 16 01:51:12 2016        
(r310141)
@@ -11,16 +11,20 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include <stdio.h>
-#include <math.h>
+#include <sys/capsicum.h>
+#include <sys/ioctl.h>
+#include <sys/queue.h>
+#include <sys/ttycom.h>
+
+#include <capsicum_helpers.h>
 #include <ctype.h>
 #include <err.h>
-#include <string.h>
+#include <errno.h>
+#include <math.h>
+#include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
-#include <sys/ioctl.h>
-#include <sys/queue.h>
-#include <sys/ttycom.h>
 
 #define NSTUDENT 100
 #define NCONF 6
@@ -455,26 +459,14 @@ dbl_cmp(const void *a, const void *b)
 }
 
 static struct dataset *
-ReadSet(const char *n, int column, const char *delim)
+ReadSet(FILE *f, const char *n, int column, const char *delim)
 {
-       FILE *f;
        char buf[BUFSIZ], *p, *t;
        struct dataset *s;
        double d;
        int line;
        int i;
 
-       if (n == NULL) {
-               f = stdin;
-               n = "<stdin>";
-       } else if (!strcmp(n, "-")) {
-               f = stdin;
-               n = "<stdin>";
-       } else {
-               f = fopen(n, "r");
-       }
-       if (f == NULL)
-               err(1, "Cannot open %s", n);
        s = NewSet();
        s->name = strdup(n);
        line = 0;
@@ -499,7 +491,6 @@ ReadSet(const char *n, int column, const
                if (*buf != '\0')
                        AddPoint(s, d);
        }
-       fclose(f);
        if (s->n < 3) {
                fprintf(stderr,
                    "Dataset %s must contain at least 3 data points\n", n);
@@ -536,7 +527,9 @@ usage(char const *whine)
 int
 main(int argc, char **argv)
 {
-       struct dataset *ds[7];
+       const char *setfilenames[MAX_DS - 1];
+       struct dataset *ds[MAX_DS - 1];
+       FILE *setfiles[MAX_DS - 1];
        int nds;
        double a;
        const char *delim = " \t";
@@ -609,14 +602,36 @@ main(int argc, char **argv)
        argv += optind;
 
        if (argc == 0) {
-               ds[0] = ReadSet("-", column, delim);
+               setfilenames[0] = "<stdin>";
+               setfiles[0] = stdin;
                nds = 1;
        } else {
                if (argc > (MAX_DS - 1))
                        usage("Too many datasets.");
                nds = argc;
-               for (i = 0; i < nds; i++)
-                       ds[i] = ReadSet(argv[i], column, delim);
+               for (i = 0; i < nds; i++) {
+                       setfilenames[i] = argv[i];
+                       setfiles[i] = fopen(argv[i], "r");
+                       if (setfiles[i] == NULL)
+                               err(2, "Cannot open %s", argv[i]);
+               }
+       }
+
+       if (caph_limit_stdio() < 0)
+               err(2, "capsicum");
+
+       for (i = 0; i < nds; i++)
+               if (caph_limit_stream(fileno(setfiles[i]), CAPH_READ) < 0)
+                       err(2, "unable to limit rights for %s",
+                           setfilenames[i]);
+
+       /* Enter Capsicum sandbox. */
+       if (cap_enter() < 0 && errno != ENOSYS)
+               err(2, "unable to enter capability mode");
+
+       for (i = 0; i < nds; i++) {
+               ds[i] = ReadSet(setfiles[i], setfilenames[i], column, delim);
+               fclose(setfiles[i]);
        }
 
        for (i = 0; i < nds; i++) 
_______________________________________________
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