Add a flag to drop access to the session keyring am: 866bb3acc5 am: 7e8d5acfd6 am: 764b31ce4b
am: ba566a1da6

Change-Id: I363c809607b18df423682910be82d4b73d7827c9
diff --git a/libminijail.c b/libminijail.c
index 4690c6b..d005803 100644
--- a/libminijail.c
+++ b/libminijail.c
@@ -105,6 +105,9 @@
 
 #define MAX_CGROUPS 10 /* 10 different controllers supported by Linux. */
 
+/* Keyctl commands. */
+#define KEYCTL_JOIN_SESSION_KEYRING 1
+
 struct mountpoint {
 	char *src;
 	char *dest;
@@ -153,6 +156,7 @@
 		int alt_syscall : 1;
 		int reset_signal_mask : 1;
 		int close_open_fds : 1;
+		int new_session_keyring : 1;
 	} flags;
 	uid_t uid;
 	gid_t gid;
@@ -435,6 +439,11 @@
 	j->flags.enter_vfs = 1;
 }
 
+void API minijail_new_session_keyring(struct minijail *j)
+{
+	j->flags.new_session_keyring = 1;
+}
+
 void API minijail_skip_remount_private(struct minijail *j)
 {
 	j->flags.skip_remount_private = 1;
@@ -1647,6 +1656,11 @@
 	if (j->flags.ns_cgroups && unshare(CLONE_NEWCGROUP))
 		pdie("unshare(CLONE_NEWCGROUP) failed");
 
+	if (j->flags.new_session_keyring) {
+		if (syscall(SYS_keyctl, KEYCTL_JOIN_SESSION_KEYRING, NULL) < 0)
+			pdie("keyctl(KEYCTL_JOIN_SESSION_KEYRING) failed");
+	}
+
 	if (j->flags.chroot && enter_chroot(j))
 		pdie("chroot");
 
diff --git a/libminijail.h b/libminijail.h
index 14aeece..2bf3024 100644
--- a/libminijail.h
+++ b/libminijail.h
@@ -61,6 +61,8 @@
 void minijail_reset_signal_mask(struct minijail *j);
 void minijail_namespace_vfs(struct minijail *j);
 void minijail_namespace_enter_vfs(struct minijail *j, const char *ns_path);
+void minijail_new_session_keyring(struct minijail *j);
+
 /*
  * This option is *dangerous* as it negates most of the functionality of
  * minijail_namespace_vfs(). You very likely don't need this.
diff --git a/minijail0.1 b/minijail0.1
index cdc3083..e186fef 100644
--- a/minijail0.1
+++ b/minijail0.1
@@ -138,6 +138,10 @@
 \fB-V <file>\fR
 Enter the VFS namespace specified by \fIfile\fR.
 .TP
+\fB-w\fR
+Create and join a new anonymous session keyring.  See \fBkeyrings\fR(7) for more
+details.
+.TP
 \fB-y\fR
 Keep the current user's supplementary groups.
 .TP
diff --git a/minijail0.c b/minijail0.c
index bfb5671..12537c3 100644
--- a/minijail0.c
+++ b/minijail0.c
@@ -175,6 +175,7 @@
 	       "  -U:         Enter new user namespace (implies -p).\n"
 	       "  -v:         Enter new mount namespace.\n"
 	       "  -V <file>:  Enter specified mount namespace.\n"
+	       "  -w:         Create and join a new anonymous session keyring.\n"
 	       "  -Y:         Synchronize seccomp filters across thread group.\n");
 	/* clang-format on */
 }
@@ -206,7 +207,7 @@
 		return 1;
 
 	const char *optstring =
-	    "u:g:sS:c:C:P:b:V:f:m::M::k:a:e::T:vrGhHinNplLt::IUKyY";
+	    "u:g:sS:c:C:P:b:V:f:m::M::k:a:e::T:vrGhHinNplLt::IUKwyY";
 	while ((opt = getopt(argc, argv, optstring)) != -1) {
 		switch (opt) {
 		case 'u':
@@ -413,6 +414,9 @@
 				exit(1);
 			}
 			break;
+		case 'w':
+			minijail_new_session_keyring(j);
+			break;
 		case 'Y':
 			minijail_set_seccomp_filter_tsync(j);
 			break;