PERFORCE change 173856 for review
Jonathan Anderson
jona at FreeBSD.org
Thu Jan 28 19:23:21 UTC 2010
http://p4web.freebsd.org/chv.cgi?CH=173856
Change 173856 by jona at jona-capsicum-kent64 on 2010/01/28 19:23:18
Added lc_fdlist_global() and tests, although there is no implementation.
Affected files ...
.. //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum.h#3 edit
.. //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_fdlist.c#2 edit
.. //depot/projects/trustedbsd/capabilities/src/tools/cap/fdlist/fdlist.c#4 edit
Differences ...
==== //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum.h#3 (text+ko) ====
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum.h#2 $
+ * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum.h#3 $
*/
#ifndef _LIBCAPABILITY_H_
@@ -57,11 +57,12 @@
/* A list of file descriptors, which can be passed around in shared memory */
struct lc_fdlist;
-
struct lc_fdlist* lc_fdlist_new(void);
+struct lc_fdlist* lc_fdlist_global(void);
struct lc_fdlist* lc_fdlist_dup(struct lc_fdlist *orig);
void lc_fdlist_free(struct lc_fdlist *l);
+
/* Size of an FD list in bytes, including all associated string data */
int lc_fdlist_size(struct lc_fdlist *l);
==== //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_fdlist.c#2 (text+ko) ====
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_fdlist.c#1 $
+ * $P4: //depot/projects/trustedbsd/capabilities/src/lib/libcapsicum/libcapsicum_fdlist.c#2 $
*/
#include <errno.h>
@@ -81,6 +81,16 @@
+struct lc_fdlist *global_fdlist = NULL;
+
+
+struct lc_fdlist*
+lc_fdlist_global(void) {
+
+ return global_fdlist;
+}
+
+
#define INITIAL_ENTRIES 16
#define INITIAL_NAMEBYTES (64 * INITIAL_ENTRIES)
@@ -143,6 +153,12 @@
struct lc_fdlist *l = *fdlist;
+ if (l == NULL) {
+
+ errno = EINVAL;
+ return -1;
+ }
+
LOCK(l);
/* do we need more entry space? */
@@ -258,6 +274,11 @@
const char *subsystem, const char *id, char **name, int *fdp,
int *pos) {
+ if (l == NULL) {
+ errno = EINVAL;
+ return -1;
+ }
+
LOCK(l);
int successful = 0;
==== //depot/projects/trustedbsd/capabilities/src/tools/cap/fdlist/fdlist.c#4 (text+ko) ====
@@ -46,40 +46,31 @@
#include <unistd.h>
+
+int add_junk(struct lc_fdlist**);
+int find_junk(struct lc_fdlist*);
+
+
/*
* Unsandboxed host process with full user rights.
*/
int
main(int argc, char *argv[])
{
+ /* create an FD list and add some junk to it */
struct lc_fdlist *fds = lc_fdlist_new();
- if (fds == NULL)
- err(-1, "Error in lc_fdlist_new()");
+ if (fds == NULL) err(-1, "Error in lc_fdlist_new()");
lc_fdlist_add(&fds, "org.freebsd.Capsicum", "testfile",
"/etc/passwd", open("/etc/passwd", O_RDONLY));
lc_fdlist_addcap(&fds, "org.freebsd.Capsicum", "testfile",
"/etc/group", open("/etc/group", O_RDONLY), CAP_READ);
- for (int i = 0; i < 20; i++)
- lc_fdlist_add(&fds, "org.freebsd.Capsicum", "testjunk",
- "garbage", 50 + i);
+ if (add_junk(&fds) < 0) err(-1, "Error in add_junk()");
+ if (find_junk(fds) < 0) err(-1, "Error in find_junk()");
- int pos = 0;
- for (int i = 0; i < 20; i++) {
- char *name;
- int value;
- lc_fdlist_lookup(fds, "org.freebsd.Capsicum", "testjunk",
- &name, &value, &pos);
-
- if (strcmp("garbage", name))
- warnx("i=%i\tGot '%s' instead of 'garbage'", i, name);
-
- if (value != 50 + i)
- warnx("i=%i\tGot 'FD' %i instead of %i", i, value, 50 + i);
- }
-
+ /* copy it into a shared memory segment and see if it still works */
int shmfd = shm_open(SHM_ANON, O_RDWR, 0600);
if (shmfd < 0)
err(-1, "Error opening shared memory");
@@ -99,14 +90,67 @@
struct lc_fdlist *copy = (struct lc_fdlist*) shm;
+ if (find_junk(copy) < 0) err(-1, "Error in find_junk(copy)");
+
+ printf("OK\n");
+
+
+ /* run sandbox */
+ int me = open(argv[0], O_RDONLY);
+ if (me < 0) err(-1, "Error opening my own binary, '%s'", argv[0]);
+
+ char *sargv[] = { "fdlist-sandbox", NULL };
+ struct lc_sandbox *sandbox;
+
+ if (lch_startfd(me, "fdlist-sandbox", sargv,
+ LCH_PERMIT_STDOUT | LCH_PERMIT_STDERR, fds, &sandbox))
+
+ err(-1, "Error starting sandbox");
+
+ sleep(1);
+ return 0;
+}
+
+
+
+int cap_main(__unused int argc, __unused char *argv[])
+{
+ printf("cap_main() alive\n"); fflush(stdout);
+
+ struct lc_fdlist *global_fdlist = lc_fdlist_global();
+ if (find_junk(global_fdlist) < 0)
+ err(-1, "Error in find_junk(global_fdlist)");
+
+ struct lc_fdlist *copy = lc_fdlist_dup(global_fdlist);
+ if (find_junk(copy) < 0)
+ err(-1, "Error in find_junk(copy)");
+
+ printf("OK\n");
+
+ return 0;
+}
+
- pos = 0;
+int add_junk(struct lc_fdlist **fds)
+{
+ for (int i = 0; i < 20; i++)
+ if (lc_fdlist_add(fds, "org.freebsd.Capsicum", "testjunk",
+ "garbage", 50 + i) < 0)
+ return -1;
+
+ return 0;
+}
+
+int find_junk(struct lc_fdlist *fds)
+{
+ int pos = 0;
for (int i = 0; i < 20; i++) {
char *name;
int value;
- lc_fdlist_lookup(copy, "org.freebsd.Capsicum", "testjunk",
- &name, &value, &pos);
+ if (lc_fdlist_lookup(fds, "org.freebsd.Capsicum", "testjunk",
+ &name, &value, &pos) < 0)
+ return -1;
if (strcmp("garbage", name))
warnx("i=%i\tGot '%s' instead of 'garbage'", i, name);
@@ -115,10 +159,6 @@
warnx("i=%i\tGot 'FD' %i instead of %i", i, value, 50 + i);
}
-
- printf("OK\n");
-
-
return 0;
}
More information about the p4-projects
mailing list