setpriv: Preliminary no_cap_ambient_raise support

Signed-off-by: Andy Lutomirski <luto@kernel.org>
diff --git a/sys-utils/setpriv.c b/sys-utils/setpriv.c
index e44b5f5..7907c9f 100644
--- a/sys-utils/setpriv.c
+++ b/sys-utils/setpriv.c
@@ -53,6 +53,15 @@
 #  define PR_CAP_AMBIENT_LOWER	3
 #endif
 
+#ifndef SECURE_NO_CAP_AMBIENT_RAISE
+# define SECURE_NO_CAP_AMBIENT_RAISE            6
+# define SECURE_NO_CAP_AMBIENT_RAISE_LOCKED     7  /* make bit-6 immutable */
+# define SECBIT_NO_CAP_AMBIENT_RAISE \
+	(issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE))
+# define SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED \
+	(issecure_mask(SECURE_NO_CAP_AMBIENT_RAISE_LOCKED))
+#endif
+
 #define SETPRIV_EXIT_PRIVERR 127	/* how we exit when we fail to set privs */
 
 /*
@@ -226,6 +235,10 @@
 	bits &= ~SECBIT_KEEP_CAPS;
 	dump_one_secbit(&first, &bits, SECBIT_KEEP_CAPS_LOCKED,
 			"keep_caps_locked");
+	dump_one_secbit(&first, &bits, SECBIT_NO_CAP_AMBIENT_RAISE,
+			"no_cap_ambient_raise");
+	dump_one_secbit(&first, &bits, SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED,
+			"no_cap_ambient_raise_locked");
 	if (bits) {
 		if (!first)
 			printf(",");
@@ -514,7 +527,9 @@
 				      SECBIT_NO_SETUID_FIXUP |
 				      SECBIT_NO_SETUID_FIXUP_LOCKED |
 				      SECBIT_KEEP_CAPS |
-				      SECBIT_KEEP_CAPS_LOCKED))
+				      SECBIT_KEEP_CAPS_LOCKED |
+				      SECBIT_NO_CAP_AMBIENT_RAISE |
+				      SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED))
 		errx(SETPRIV_EXIT_PRIVERR,
 		     _("unrecognized securebit set -- refusing to adjust"));
 
@@ -543,6 +558,10 @@
 				     _("adjusting keep_caps does not make sense"));
 			else if (!strcmp(c + 1, "keep_caps_locked"))
 				bit = SECBIT_KEEP_CAPS_LOCKED;	/* sigh */
+			else if (!strcmp(c + 1, "no_cap_ambient_raise"))
+				bit = SECBIT_NO_CAP_AMBIENT_RAISE;
+			else if (!strcmp(c + 1, "no_cap_ambient_raise_locked"))
+				bit = SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED;
 			else
 				errx(EXIT_FAILURE, _("unrecognized securebit"));