PERFORCE change 156893 for review
Robert Watson
rwatson at FreeBSD.org
Thu Jan 29 15:30:05 PST 2009
http://perforce.freebsd.org/chv.cgi?CH=156893
Change 156893 by rwatson at rwatson_freebsd_capabilities on 2009/01/29 23:30:00
Test CAP_MAPEXEC with PROT_EXEC in mmap/capability regression
test.
Affected files ...
.. //depot/projects/trustedbsd/capabilities/src/tools/regression/security/cap_test/cap_test_capabilities.c#3 edit
Differences ...
==== //depot/projects/trustedbsd/capabilities/src/tools/regression/security/cap_test/cap_test_capabilities.c#3 (text+ko) ====
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2008 Robert N. M. Watson
+ * Copyright (c) 2008-2009 Robert N. M. Watson
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -30,9 +30,9 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$P4: //depot/projects/trustedbsd/capabilities/src/tools/regression/security/cap_test/cap_test_capabilities.c#2 $");
+__FBSDID("$P4: //depot/projects/trustedbsd/capabilities/src/tools/regression/security/cap_test/cap_test_capabilities.c#3 $");
-#include <sys/types.h>
+#include <sys/param.h>
#include <sys/capability.h>
#include <sys/mman.h>
#include <sys/mount.h>
@@ -181,6 +181,20 @@
}
}
+ p = mmap(NULL, getpagesize(), PROT_EXEC, MAP_SHARED, fd_cap, 0);
+ if ((rights & (CAP_MMAP | CAP_MAPEXEC)) == (CAP_MMAP | CAP_MAPEXEC)) {
+ if (p == MAP_FAILED)
+ warnx("rights 0x%llx mmap mapexec failed error %d",
+ rights, errno);
+ else
+ (void)munmap(p, getpagesize());
+ } else {
+ if (p != MAP_FAILED) {
+ warnx("rights 0x%llx mmap mapexec succeeded", rights);
+ (void)munmap(p, getpagesize());
+ }
+ }
+
p = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED,
fd_cap, 0);
if ((rights & (CAP_MMAP | CAP_READ | CAP_WRITE)) == (CAP_MMAP |
@@ -198,6 +212,57 @@
}
}
+ p = mmap(NULL, getpagesize(), PROT_READ | PROT_EXEC, MAP_SHARED,
+ fd_cap, 0);
+ if ((rights & (CAP_MMAP | CAP_READ | CAP_MAPEXEC)) == (CAP_MMAP |
+ CAP_READ | CAP_MAPEXEC)) {
+ if (p == MAP_FAILED)
+ warnx("rights 0x%llx mmap read|mapexec failed error %d",
+ rights, errno);
+ else
+ (void)munmap(p, getpagesize());
+ } else {
+ if (p != MAP_FAILED) {
+ warnx("rights 0x%llx mmap read|mapexec succeeded",
+ rights);
+ (void)munmap(p, getpagesize());
+ }
+ }
+
+ p = mmap(NULL, getpagesize(), PROT_EXEC | PROT_WRITE, MAP_SHARED,
+ fd_cap, 0);
+ if ((rights & (CAP_MMAP | CAP_MAPEXEC | CAP_WRITE)) == (CAP_MMAP |
+ CAP_MAPEXEC | CAP_WRITE)) {
+ if (p == MAP_FAILED)
+ warnx("rights 0x%llx mmap mapexec|write failed "
+ "error %d", rights, errno);
+ else
+ (void)munmap(p, getpagesize());
+ } else {
+ if (p != MAP_FAILED) {
+ warnx("rights 0x%llx mmap mapexec|write succeeded",
+ rights);
+ (void)munmap(p, getpagesize());
+ }
+ }
+
+ p = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC,
+ MAP_SHARED, fd_cap, 0);
+ if ((rights & (CAP_MMAP | CAP_READ | CAP_WRITE | CAP_MAPEXEC)) ==
+ (CAP_MMAP | CAP_READ | CAP_WRITE | CAP_MAPEXEC)) {
+ if (p == MAP_FAILED)
+ warnx("rights 0x%llx mmap read|write|mapexec failed "
+ "error %d", rights, errno);
+ else
+ (void)munmap(p, getpagesize());
+ } else {
+ if (p != MAP_FAILED) {
+ warnx("rights 0x%llx mmap read|write|mapexec "
+ "succeeded", rights);
+ (void)munmap(p, getpagesize());
+ }
+ }
+
/* XXX fcntl */
/* XXX select / poll / kqueue */
@@ -316,7 +381,11 @@
try_file_ops(fd, CAP_MMAP);
try_file_ops(fd, CAP_MMAP | CAP_READ);
try_file_ops(fd, CAP_MMAP | CAP_WRITE);
+ try_file_ops(fd, CAP_MMAP | CAP_MAPEXEC);
try_file_ops(fd, CAP_MMAP | CAP_READ | CAP_WRITE);
+ try_file_ops(fd, CAP_MMAP | CAP_READ | CAP_MAPEXEC);
+ try_file_ops(fd, CAP_MMAP | CAP_MAPEXEC | CAP_WRITE);
+ try_file_ops(fd, CAP_MMAP | CAP_READ | CAP_WRITE | CAP_MAPEXEC);
try_file_ops(fd, CAP_FCNTL);
try_file_ops(fd, CAP_EVENT);
try_file_ops(fd, CAP_FSYNC);
More information about the p4-projects
mailing list