* ! DISCLAIMER ! *
! I don't have a system which has SELinux enabled, nor have I ever really
used SELinux.
! Therefore, I crafted the following on a best-effort basis, and tested it
only on my
! system which has the selinux-devel package installed, once with the default
configure
! options and once with --without-selinux.
My openSUSE:Tumbleweed has updated to SELinux 3.1 a couple of weeks ago.
Since then, I see the following warnings:
CC lib/selinux-at.o
In file included from lib/selinux-at.c:21:
lib/selinux-at.h:34:1: error: 'security_context_t' is deprecated
[-Werror=deprecated-declarations]
34 | int getfileconat (int dir_fd, char const *file, security_context_t
*con);
| ^~~
...
CC src/selinux.o
src/selinux.c: In function 'defaultcon':
src/selinux.c:131:3: error: 'matchpathcon' is deprecated: Use selabel_lookup
instead [-Werror=deprecated-declarations]
131 | if (matchpathcon (path, mode, &scon) < 0)
| ^~
In file included from ./lib/selinux/selinux.h:25,
from src/selinux.c:20:
/usr/include/selinux/selinux.h:500:12: note: declared here
500 | extern int matchpathcon(const char *path,
| ^~~~~~~~~~~~
The attached 2 patches attempt to fix this:
* [PATCH] selinux-h: add label stubs
File 'gnulib-se-label.patch'.
This gnulib patch creates the stubs for se-label similar to the se-context
stubs.
* [PATCH] install,cp,mv,mkdir,mkfifo,mknod: port to SELinux 3.1
File
'~/gnulib-se-label/0001-install-cp-mv-mkdir-mkfifo-mknod-port-to-SELinux-3.1.patch'.
This coreutils patch updates gnulib to latest (including the above gnulib
patch),
and replaces the deprecated matchpathcon calls.
To go past the 'public-submodule-commit' error, one has to run the tests like:
make check gl_public_submodule_commit=
Is this the right approach?
Does it work on systems having SELinux enabled?
Does it work on systems with SELinux < 3.1?
Does it work on systems with SELinux >= 3.1?
If yes, then I'd forward to gnulib patch to ... well, gnulib.
Have a nice day,
Berny
>From e50474b28a62fa12ee621c7d46d6f8132c842f3b Mon Sep 17 00:00:00 2001
From: Bernhard Voelker <[email protected]>
Date: Wed, 21 Oct 2020 20:38:40 +0200
Subject: [PATCH] install,cp,mv,mkdir,mkfifo,mknod: port to SELinux 3.1
The new SELinux release deprecated the 'matchpathcon' function, and the
typedef 'security_context_t'.
* gnulib: Update submodule to latest, mainly for these two commits:
> selinux-h: add label stubs
> selinux-at, selinux-h: port to SELinux 3.1
* src/install.c (setdefaultfilecon): Replace deprecated matchpathcon
by selabel_open, selabel_lookup and selabel_close.
* src/selinux.c (<selinux/label.h>): Add #include.
(defaultcon): Likewise.
(restorecon_private): Likewise.
* .gitignore (/lib/se-label.h): Add entry.
---
.gitignore | 1 +
gnulib | 2 +-
src/install.c | 13 +++++++++++--
src/selinux.c | 20 ++++++++++++++++++--
4 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/.gitignore b/.gitignore
index e1abcdfb7..6ee38438b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -86,6 +86,7 @@
/lib/ref-del.sed
/lib/sched.h
/lib/se-context.h
+/lib/se-label.h
/lib/se-selinux.h
/lib/selinux
/lib/signal.h
diff --git a/gnulib b/gnulib
index 2d386f229..d08237934 160000
--- a/gnulib
+++ b/gnulib
@@ -1 +1 @@
-Subproject commit 2d386f229aba9ecda85736b931e2964d7922d90e
+Subproject commit d0823793490b9dae0578df2cd75c6a7e077ab6c2
diff --git a/src/install.c b/src/install.c
index a94053f4d..3b557af74 100644
--- a/src/install.c
+++ b/src/install.c
@@ -24,6 +24,7 @@
#include <pwd.h>
#include <grp.h>
#include <selinux/selinux.h>
+#include <selinux/label.h>
#include <sys/wait.h>
#include "system.h"
@@ -316,6 +317,8 @@ setdefaultfilecon (char const *file)
struct stat st;
char *scontext = NULL;
static bool first_call = true;
+ struct selabel_handle *hnd;
+ struct selinux_opt sel_options[SELABEL_NOPT] = {};
if (selinux_enabled != 1)
{
@@ -365,12 +368,17 @@ setdefaultfilecon (char const *file)
/* If there's an error determining the context, or it has none,
return to allow default context. Note the "<<none>>" check
is only needed for libselinux < 1.20 (2005-01-04). */
- if ((matchpathcon (file, st.st_mode, &scontext) != 0)
+ hnd = selabel_open (SELABEL_CTX_FILE, sel_options, SELABEL_NOPT);
+ if (!hnd)
+ return;
+
+ if ((selabel_lookup (hnd, &scontext, file, st.st_mode) < 0)
|| STREQ (scontext, "<<none>>"))
{
if (scontext != NULL)
freecon (scontext);
- return;
+ selabel_close (hnd);
+ return;
}
if (lsetfilecon (file, scontext) < 0 && errno != ENOTSUP)
@@ -379,6 +387,7 @@ setdefaultfilecon (char const *file)
quotef_n (0, file), quote_n (1, scontext));
freecon (scontext);
+ selabel_close (hnd);
return;
}
#else
diff --git a/src/selinux.c b/src/selinux.c
index 874ad5b6d..f626fd0e7 100644
--- a/src/selinux.c
+++ b/src/selinux.c
@@ -19,6 +19,7 @@
#include <config.h>
#include <selinux/selinux.h>
#include <selinux/context.h>
+#include <selinux/label.h>
#include <sys/types.h>
#include "die.h"
@@ -116,6 +117,8 @@ defaultcon (char const *path, mode_t mode)
const char *contype;
char *constr;
char *newpath = NULL;
+ struct selabel_handle *hnd;
+ struct selinux_opt sel_options[SELABEL_NOPT] = {};
if (! IS_ABSOLUTE_FILE_NAME (path))
{
@@ -128,7 +131,11 @@ defaultcon (char const *path, mode_t mode)
path = newpath;
}
- if (matchpathcon (path, mode, &scon) < 0)
+ hnd = selabel_open (SELABEL_CTX_FILE, sel_options, SELABEL_NOPT);
+ if (!hnd)
+ goto quit;
+
+ if (selabel_lookup (hnd, &scon, path, mode) < 0)
{
/* "No such file or directory" is a confusing error,
when processing files, when in fact it was the
@@ -161,6 +168,7 @@ quit:
freecon (scon);
freecon (tcon);
free (newpath);
+ selabel_close (hnd);
return rc;
}
@@ -188,6 +196,8 @@ restorecon_private (char const *path, bool local)
const char *contype;
char *constr;
int fd;
+ struct selabel_handle *hnd = NULL;
+ struct selinux_opt sel_options[SELABEL_NOPT] = {};
if (local)
{
@@ -218,7 +228,11 @@ restorecon_private (char const *path, bool local)
goto quit;
}
- if (matchpathcon (path, sb.st_mode, &scon) < 0)
+ hnd = selabel_open (SELABEL_CTX_FILE, sel_options, SELABEL_NOPT);
+ if (!hnd)
+ goto quit;
+
+ if (selabel_lookup (hnd, &scon, path, sb.st_mode) < 0)
{
/* "No such file or directory" is a confusing error,
when processing files, when in fact it was the
@@ -265,6 +279,8 @@ quit:
context_free (tcontext);
freecon (scon);
freecon (tcon);
+ if (hnd)
+ selabel_close (hnd);
return rc;
}
--
2.29.2
>From d0823793490b9dae0578df2cd75c6a7e077ab6c2 Mon Sep 17 00:00:00 2001
From: Bernhard Voelker <[email protected]>
Date: Thu, 19 Nov 2020 22:40:21 +0100
Subject: [PATCH] selinux-h: add label stubs
* lib/se-label.c: Add file.
* lib/se-label.in.h: Likewise.
* m4/selinux-label-h.m4: Likewise.
* modules/selinux-h (Files): Reference the above new files.
(configure.ac): Call gl_HEADERS_SELINUX_LABEL_H.
(Makefile.am): Add se-label.in.h and se-label.c.
(selinux/label.h): Generate from se-label.in.h if necessary.
* lib/se-selinux.in.h (struct selinux_opt): Define.
* lib/selinux-at.h: Include <selinux/label.h> as well.
---
ChangeLog | 12 ++++++++
lib/se-label.c | 3 ++
lib/se-label.in.h | 65 +++++++++++++++++++++++++++++++++++++++++++
lib/se-selinux.in.h | 6 ++++
lib/selinux-at.h | 1 +
m4/selinux-label-h.m4 | 22 +++++++++++++++
modules/selinux-h | 24 +++++++++++++++-
7 files changed, 132 insertions(+), 1 deletion(-)
create mode 100644 lib/se-label.c
create mode 100644 lib/se-label.in.h
create mode 100644 m4/selinux-label-h.m4
diff --git a/ChangeLog b/ChangeLog
index 52524da54..c45a32485 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2020-11-19 Bernhard Voelker <[email protected]>
+
+ selinux-h: add label stubs
+ * lib/se-label.c: Add file.
+ * lib/se-label.in.h: Likewise.
+ * m4/selinux-label-h.m4: Likewise.
+ * modules/selinux-h (Files): Reference the above new files.
+ (configure.ac): Call gl_HEADERS_SELINUX_LABEL_H.
+ (Makefile.am): Add se-label.in.h and se-label.c.
+ (selinux/label.h): Generate from se-label.in.h if necessary.
+ * lib/selinux-at.h: Include <selinux/label.h> as well.
+
2020-11-19 Siddhesh Poyarekar <[email protected]>
vcs-to-changelog: Expect spaces in file names
diff --git a/lib/se-label.c b/lib/se-label.c
new file mode 100644
index 000000000..16d706fd8
--- /dev/null
+++ b/lib/se-label.c
@@ -0,0 +1,3 @@
+#include <config.h>
+#define SE_LABEL_INLINE _GL_EXTERN_INLINE
+#include <selinux/label.h>
diff --git a/lib/se-label.in.h b/lib/se-label.in.h
new file mode 100644
index 000000000..af45e6e6e
--- /dev/null
+++ b/lib/se-label.in.h
@@ -0,0 +1,65 @@
+/* SELinux-related headers.
+ Copyright (C) 2020 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Bernhard Voelker, 2020. */
+
+#ifndef SELINUX_LABEL_H
+# define SELINUX_LABEL_H
+
+# include <errno.h>
+# include <selinux/selinux.h> /* for struct selinux_opt */
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef SE_LABEL_INLINE
+# define SE_LABEL_INLINE _GL_INLINE
+#endif
+
+/* The definition of _GL_UNUSED_PARAMETER is copied here. */
+
+/* Available backend: file contexts */
+#define SELABEL_CTX_FILE 0
+
+/* Total number of SELABEL_OPT options */
+#define SELABEL_NOPT 6
+
+/*
+ * Opaque type used for all label handles.
+ */
+struct selabel_handle;
+
+SE_LABEL_INLINE struct selabel_handle *
+selabel_open (unsigned int backend _GL_UNUSED_PARAMETER,
+ const struct selinux_opt *opts _GL_UNUSED_PARAMETER,
+ unsigned nopts _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return 0; }
+
+SE_LABEL_INLINE void
+selabel_close (struct selabel_handle *handle _GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return; }
+
+SE_LABEL_INLINE int
+selabel_lookup (struct selabel_handle *handle _GL_UNUSED_PARAMETER,
+ char **con _GL_UNUSED_PARAMETER,
+ const char *key_GL_UNUSED_PARAMETER,
+ int type_GL_UNUSED_PARAMETER)
+ { errno = ENOTSUP; return -1; }
+
+_GL_INLINE_HEADER_END
+
+#endif
diff --git a/lib/se-selinux.in.h b/lib/se-selinux.in.h
index 022596bb8..323ae17db 100644
--- a/lib/se-selinux.in.h
+++ b/lib/se-selinux.in.h
@@ -42,6 +42,12 @@ _GL_INLINE_HEADER_BEGIN
# if !GNULIB_defined_security_types
+/* Structure for passing options, used by AVC and label subsystems */
+struct selinux_opt {
+ int type;
+ const char *value;
+};
+
typedef unsigned short security_class_t;
# define is_selinux_enabled() 0
diff --git a/lib/selinux-at.h b/lib/selinux-at.h
index 50537f80f..d8fe305f4 100644
--- a/lib/selinux-at.h
+++ b/lib/selinux-at.h
@@ -16,6 +16,7 @@
#include <selinux/selinux.h>
#include <selinux/context.h>
+#include <selinux/label.h>
/* These are the dir-fd-relative variants of the functions without the
"at" suffix. For example, getfileconat (AT_FDCWD, file, &c) is usually
diff --git a/m4/selinux-label-h.m4 b/m4/selinux-label-h.m4
new file mode 100644
index 000000000..52925e767
--- /dev/null
+++ b/m4/selinux-label-h.m4
@@ -0,0 +1,22 @@
+# serial 1 -*- Autoconf -*-
+# Copyright (C) 2020 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# From Bernhard Voelker
+# Provide <selinux/label.h>, if necessary.
+
+AC_DEFUN([gl_HEADERS_SELINUX_LABEL_H],
+[
+ AC_REQUIRE([gl_LIBSELINUX])
+ if test "$with_selinux" != no; then
+ AC_CHECK_HEADERS([selinux/label.h],
+ [SELINUX_LABEL_H=],
+ [SELINUX_LABEL_H=selinux/label.h])
+ else
+ SELINUX_LABEL_H=selinux/label.h
+ fi
+ AC_SUBST([SELINUX_LABEL_H])
+ AM_CONDITIONAL([GL_GENERATE_SELINUX_LABEL_H], [test -n "$SELINUX_LABEL_H"])
+])
diff --git a/modules/selinux-h b/modules/selinux-h
index e074e673f..674767715 100644
--- a/modules/selinux-h
+++ b/modules/selinux-h
@@ -4,10 +4,13 @@ SELinux-related headers for systems that lack them.
Files:
lib/getfilecon.c
lib/se-context.in.h
+lib/se-label.in.h
lib/se-selinux.in.h
lib/se-context.c
+lib/se-label.c
lib/se-selinux.c
m4/selinux-context-h.m4
+m4/selinux-label-h.m4
m4/selinux-selinux-h.m4
Depends-on:
@@ -18,12 +21,13 @@ snippet/unused-parameter
configure.ac:
gl_HEADERS_SELINUX_SELINUX_H
gl_HEADERS_SELINUX_CONTEXT_H
+gl_HEADERS_SELINUX_LABEL_H
if test "$with_selinux" != no && test "$ac_cv_header_selinux_selinux_h" = yes; then
AC_LIBOBJ([getfilecon])
fi
Makefile.am:
-lib_SOURCES += se-context.in.h se-selinux.in.h se-context.c se-selinux.c
+lib_SOURCES += se-context.in.h se-label.in.h se-selinux.in.h se-context.c se-label.c se-selinux.c
BUILT_SOURCES += selinux/selinux.h
selinux/selinux.h: se-selinux.in.h $(top_builddir)/config.status $(UNUSED_PARAMETER_H)
@@ -58,11 +62,29 @@ selinux/context.h: $(top_builddir)/config.status
rm -f $@
endif
MOSTLYCLEANFILES += selinux/context.h selinux/context.h-t
+
+BUILT_SOURCES += $(SELINUX_LABEL_H)
+if GL_GENERATE_SELINUX_LABEL_H
+selinux/label.h: se-label.in.h $(top_builddir)/config.status $(UNUSED_PARAMETER_H)
+ $(AM_V_at)$(MKDIR_P) selinux
+ $(AM_V_GEN)rm -f $@-t $@ && \
+ { echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */' && \
+ sed -e '/definition of _GL_UNUSED_PARAMETER/r $(UNUSED_PARAMETER_H)' \
+ < $(srcdir)/se-label.in.h; \
+ } > $@-t && \
+ chmod a-x $@-t && \
+ mv $@-t $@
+else
+selinux/label.h: $(top_builddir)/config.status
+ rm -f $@
+endif
+MOSTLYCLEANFILES += selinux/label.h selinux/label.h-t
MOSTLYCLEANDIRS += selinux
Include:
<selinux/selinux.h>
<selinux/context.h>
+<selinux/label.h>
Link:
$(LIB_SELINUX)
--
2.29.2