summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>2013-06-26 11:48:27 +0300
committerPádraig Brady <P@draigBrady.com>2013-07-01 14:33:05 +0100
commit7d5976f668e0799aae1c428a17eb370f06aea1d0 (patch)
treef3ce27edc413f00ca4a22ef2e4df7e4b8ff68c50
parent1b90421a1bb27960679d180e40412d74b6ff3d0c (diff)
downloadcoreutils-7d5976f668e0799aae1c428a17eb370f06aea1d0.tar.xz
mkdir,mkfifo,mknod: with -Z, create SMACK security context
Enable creation of SMACK security context with -Z command-line switch if SMACK is enabled. * mkdir.c (main): Set process security context to given SMACK label. * mkfifo.c (main): Likewise. * mknod.c (main): Likewise. * src/local.mk: link mk{dir, fifo, nod} with libsmack. * NEWS: Mention the new feature.
-rw-r--r--NEWS3
-rw-r--r--src/local.mk3
-rw-r--r--src/mkdir.c17
-rw-r--r--src/mkfifo.c17
-rw-r--r--src/mknod.c17
5 files changed, 53 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index 320638504..75ec253ee 100644
--- a/NEWS
+++ b/NEWS
@@ -29,7 +29,8 @@ GNU coreutils NEWS -*- outline -*-
** New features
- ls -Z and id -Z report the SMACK security context where available.
+ id and ls with -Z report the SMACK security context where available.
+ mkdir, mkfifo and mknod with -Z set the SMACK context where available.
join accepts a new option: --zero-terminated (-z). As with the sort,uniq
option of the same name, this makes join consume and produce NUL-terminated
diff --git a/src/local.mk b/src/local.mk
index 626d580de..646fbada1 100644
--- a/src/local.mk
+++ b/src/local.mk
@@ -232,8 +232,11 @@ src_id_LDADD += $(LIB_SMACK)
src_ls_LDADD += $(LIB_SELINUX)
src_ls_LDADD += $(LIB_SMACK)
src_mkdir_LDADD += $(LIB_SELINUX)
+src_mkdir_LDADD += $(LIB_SMACK)
src_mkfifo_LDADD += $(LIB_SELINUX)
+src_mkfifo_LDADD += $(LIB_SMACK)
src_mknod_LDADD += $(LIB_SELINUX)
+src_mknod_LDADD += $(LIB_SMACK)
src_runcon_LDADD += $(LIB_SELINUX)
src_stat_LDADD += $(LIB_SELINUX)
diff --git a/src/mkdir.c b/src/mkdir.c
index b36237a33..e56b6cbbd 100644
--- a/src/mkdir.c
+++ b/src/mkdir.c
@@ -22,6 +22,10 @@
#include <sys/types.h>
#include <selinux/selinux.h>
+#ifdef HAVE_SMACK
+# include <sys/smack.h>
+#endif
+
#include "system.h"
#include "error.h"
#include "mkdir-p.h"
@@ -151,6 +155,7 @@ main (int argc, char **argv)
int optc;
security_context_t scontext = NULL;
struct mkdir_options options;
+ int ret = 0;
options.make_ancestor_function = NULL;
options.mode = S_IRWXUGO;
@@ -194,7 +199,17 @@ main (int argc, char **argv)
usage (EXIT_FAILURE);
}
- if (scontext && setfscreatecon (scontext) < 0)
+ if (scontext)
+ {
+#ifdef HAVE_SMACK
+ if (smack_smackfs_path ())
+ ret = smack_set_label_for_self (scontext);
+ else
+#endif
+ ret = setfscreatecon (scontext);
+ }
+
+ if (ret < 0)
error (EXIT_FAILURE, errno,
_("failed to set default file creation context to %s"),
quote (scontext));
diff --git a/src/mkfifo.c b/src/mkfifo.c
index 78ff909cc..a87a393e2 100644
--- a/src/mkfifo.c
+++ b/src/mkfifo.c
@@ -22,6 +22,10 @@
#include <sys/types.h>
#include <selinux/selinux.h>
+#ifdef HAVE_SMACK
+# include <sys/smack.h>
+#endif
+
#include "system.h"
#include "error.h"
#include "modechange.h"
@@ -76,6 +80,7 @@ main (int argc, char **argv)
int exit_status = EXIT_SUCCESS;
int optc;
security_context_t scontext = NULL;
+ int ret = 0;
initialize_main (&argc, &argv);
set_program_name (argv[0]);
@@ -108,7 +113,17 @@ main (int argc, char **argv)
usage (EXIT_FAILURE);
}
- if (scontext && setfscreatecon (scontext) < 0)
+ if (scontext)
+ {
+#ifdef HAVE_SMACK
+ if (smack_smackfs_path ())
+ ret = smack_set_label_for_self (scontext);
+ else
+#endif
+ ret = setfscreatecon (scontext);
+ }
+
+ if (ret < 0)
error (EXIT_FAILURE, errno,
_("failed to set default file creation context to %s"),
quote (scontext));
diff --git a/src/mknod.c b/src/mknod.c
index a384ad35c..9f0afb3ff 100644
--- a/src/mknod.c
+++ b/src/mknod.c
@@ -22,6 +22,10 @@
#include <sys/types.h>
#include <selinux/selinux.h>
+#ifdef HAVE_SMACK
+# include <sys/smack.h>
+#endif
+
#include "system.h"
#include "error.h"
#include "modechange.h"
@@ -93,6 +97,7 @@ main (int argc, char **argv)
int expected_operands;
mode_t node_type;
security_context_t scontext = NULL;
+ int ret = 0;
initialize_main (&argc, &argv);
set_program_name (argv[0]);
@@ -164,7 +169,17 @@ main (int argc, char **argv)
usage (EXIT_FAILURE);
}
- if (scontext && setfscreatecon (scontext) < 0)
+ if (scontext)
+ {
+#ifdef HAVE_SMACK
+ if (smack_smackfs_path ())
+ ret = smack_set_label_for_self (scontext);
+ else
+#endif
+ ret = setfscreatecon (scontext);
+ }
+
+ if (ret < 0)
error (EXIT_FAILURE, errno,
_("failed to set default file creation context to %s"),
quote (scontext));