PERFORCE change 214661 for review
Brooks Davis
brooks at FreeBSD.org
Fri Jul 20 22:36:06 UTC 2012
http://p4web.freebsd.org/@@214661?ac=10
Change 214661 by brooks at brooks_ecr_current on 2012/07/20 22:35:10
Update the capsicum code to return the mime result via a pipe
rather than relying on a shared stdout. This is more similar to
the code in browser, but is not identical.
Affected files ...
.. //depot/projects/ctsrd/beribsd/src/ctsrd/minifile/minifile.c#2 edit
Differences ...
==== //depot/projects/ctsrd/beribsd/src/ctsrd/minifile/minifile.c#2 (text+ko) ====
@@ -4,12 +4,15 @@
#include <sys/wait.h>
#include <err.h>
+#include <errno.h>
#include <fcntl.h>
#include <magic.h>
+#define _WITH_DPRINTF
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <vis.h>
enum _sbtype {
SB_NONE = 0,
@@ -30,10 +33,14 @@
char ch;
const char *fname;
int fd, status;
+ ssize_t rlen;
pid_t pid;
const char *type;
struct magic_set *magic;
+ char buf[4096], *ttype;
+ int pfd[2];
+
while ((ch = getopt(argc, argv, "s:")) != -1) {
switch(ch) {
case 's':
@@ -52,7 +59,7 @@
argc -= optind;
argv += optind;
- magic = magic_open(0);
+ magic = magic_open(MAGIC_MIME_TYPE);
if (magic == NULL)
errx(1, "magic_open()");
if (magic_load(magic, NULL) == -1) {
@@ -76,30 +83,55 @@
if (type == NULL)
errx(1, "magic_file(): %s",
magic_error(magic));
- printf("%s: %s\n", fname, type);
break;
case SB_CAPSICUM:
+ if (pipe(pfd) == -1)
+ err(1, "pipe()");
pid = fork();
if (pid < 0)
err(1, "fork()");
else if (pid == 0) {
+ close(fd);
+ close(pfd[0]);
+ /* XXX: do more cleanup here */
cap_enter();
type = magic_descriptor(magic, fd);
if (type == NULL)
- errx(1, "magic_file(): %s",
- magic_error(magic));
- printf("%s: %s\n", fname, type);
- exit(0);
+ dprintf(pfd[1], "badmagic");
+ else
+ dprintf(pfd[1], "%s", type);
+ close(pfd[1]);
+ exit(0);
} else {
- if (wait4(pid, &status, 0, NULL) == -1)
- err(1, "wait4()");
+ close(pfd[1]);
+ while (wait4(pid, &status, 0, NULL) == -1)
+ if (errno != EINTR)
+ err(1, "wait4()");
if (WIFEXITED(status) &&
- WEXITSTATUS(status) != 0)
- errx(1, "child exited with %d",
+ WEXITSTATUS(status) != 0) {
+ warnx("child exited with %d",
WEXITSTATUS(status));
- else if(WIFSIGNALED(status))
- errx(1, "child killed by signal %d",
+ close(pfd[0]);
+ type = "badmagic";
+ } else if(WIFSIGNALED(status)) {
+ warn("child killed by signal %d",
WTERMSIG(status));
+ close(pfd[0]);
+ type = "badmagic";
+ } else {
+ rlen = read(pfd[0], buf, 128);
+ close(pfd[0]);
+ if (rlen == -1)
+ type = "read error";
+ else if (rlen == 0 || rlen == 1)
+ type = "unknown";
+ else {
+ /* Don't trust the result */
+ ttype = buf + rlen;
+ strvisx(ttype, buf, rlen, 0);
+ type = ttype;
+ }
+ }
}
break;
case SB_CHERI:
@@ -107,5 +139,6 @@
default:
errx(1, "invalid sandbox type");
}
+ printf("%s: %s\n", fname, type);
}
}
More information about the p4-projects
mailing list