From b8095d25bae0588dfce8a62169f6db5496cf45c5 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Tue, 12 Nov 2013 15:07:12 +0100 Subject: [PATCH] libmount: remove smackfs* option when SMACK not enabled If there is no /sys/fs/smackfs then libmount removes smackfs*= mount options when compiled --with-smack. Note that we do the same for SELinux. References: http://www.mail-archive.com/systemd-devel@lists.freedesktop.org/msg13740.html Signed-off-by: Karel Zak --- configure.ac | 9 +++++++++ libmount/src/context_mount.c | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/configure.ac b/configure.ac index 53c0de2f0..8665780f0 100644 --- a/configure.ac +++ b/configure.ac @@ -1407,6 +1407,15 @@ AS_IF([test "x$with_systemdsystemunitdir" != "xno"], [ AM_CONDITIONAL([HAVE_SYSTEMD], [test -n "$with_systemdsystemunitdir" -a "x$with_systemdsystemunitdir" != "xno" ]) +AC_ARG_WITH([smack], + AS_HELP_STRING([--with-smack], [build with SMACK support]), + [], [with_smack=no] +) +AS_IF([test "x$with_smack" = xyes], [ + AC_DEFINE([HAVE_SMACK], [1], [Add SMACK support]) +]) + + AC_ARG_WITH([bashcompletiondir], AS_HELP_STRING([--with-bashcompletiondir=DIR], [Bash completions directory]), [], diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c index ffea65354..da6ea9b7d 100644 --- a/libmount/src/context_mount.c +++ b/libmount/src/context_mount.c @@ -115,6 +115,10 @@ static int fix_optstr(struct libmnt_context *cxt) #ifdef HAVE_LIBSELINUX int se_fix = 0, se_rem = 0; #endif +#ifdef HAVE_SMACK + int sm_rem = 0; +#endif + assert(cxt); assert(cxt->fs); assert((cxt->flags & MNT_FL_MOUNTFLAGS_MERGED)); @@ -205,6 +209,10 @@ static int fix_optstr(struct libmnt_context *cxt) mnt_optstr_deduplicate_option(&fs->fs_optstr, "rootcontext"); mnt_optstr_deduplicate_option(&fs->fs_optstr, "seclabel"); } +#endif +#ifdef HAVE_SMACK + if (access("sys/fs/smackfs", F_OK) != 0) + sm_rem = 1; #endif while (!mnt_optstr_next_option(&next, &name, &namesz, &val, &valsz)) { @@ -231,6 +239,20 @@ static int fix_optstr(struct libmnt_context *cxt) rc = mnt_optstr_fix_secontext(&fs->fs_optstr, val, valsz, &next); } +#endif +#ifdef HAVE_SMACK + else if (sm_rem && namesz >= 10 + && (!strncmp(name, "smackfsdef", 10) || + !strncmp(name, "smackfsfloor", 12) || + !strncmp(name, "smackfshat", 10) || + !strncmp(name, "smackfsroot", 11) || + !strncmp(name, "smackfstransmute", 16))) { + + next = name; + rc = mnt_optstr_remove_option_at(&fs->fs_optstr, + name, + val ? val + valsz : name + namesz); + } #endif if (rc) goto done;