libselinux-3.5-0.rc1.1
- SELinux userspace 3.5-rc1 release
This commit is contained in:
parent
85554d23bf
commit
3fc64b5d76
1
.gitignore
vendored
1
.gitignore
vendored
@ -225,3 +225,4 @@ libselinux-2.0.96.tgz
|
||||
/libselinux-3.4-rc2.tar.gz
|
||||
/libselinux-3.4-rc3.tar.gz
|
||||
/libselinux-3.4.tar.gz
|
||||
/libselinux-3.5-rc1.tar.gz
|
||||
|
@ -1,4 +1,4 @@
|
||||
From e5a015f1edd5e7ed87f6f4ec6ddb45637fa178ab Mon Sep 17 00:00:00 2001
|
||||
From 7fb581c76b547b20a149c6dad3d7c51075192bd8 Mon Sep 17 00:00:00 2001
|
||||
From: Petr Lautrbach <plautrba@redhat.com>
|
||||
Date: Fri, 30 Jul 2021 14:14:37 +0200
|
||||
Subject: [PATCH] Use SHA-2 instead of SHA-1
|
||||
@ -185,7 +185,7 @@ index c56326814b94..098c840fc59b 100644
|
||||
.BR selabel_open (3)
|
||||
must be called specifying the required
|
||||
diff --git a/libselinux/src/Makefile b/libselinux/src/Makefile
|
||||
index dc2848322e4d..fbd978237f5a 100644
|
||||
index 70ba063ada5d..0c803d8d4aae 100644
|
||||
--- a/libselinux/src/Makefile
|
||||
+++ b/libselinux/src/Makefile
|
||||
@@ -125,7 +125,7 @@ DISABLE_FLAGS+= -DNO_MEDIA_BACKEND -DNO_DB_BACKEND -DNO_X_BACKEND \
|
@ -1,111 +0,0 @@
|
||||
From dd98fa322766760c4e1f029cf19d2515a583304f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Fri, 20 May 2022 15:16:10 +0200
|
||||
Subject: [PATCH] libselinux: declare return value of context_str(3) const
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
context_str(3) returns a string representation of the given context.
|
||||
This string is owned by the context and free'd on context_free(3).
|
||||
Declare it const, as already done in the man page, since it must not be
|
||||
free'd by the caller.
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: Nicolas Iooss <nicolas.iooss@m4x.org>
|
||||
---
|
||||
libselinux/include/selinux/context.h | 2 +-
|
||||
libselinux/src/context.c | 2 +-
|
||||
libselinux/src/get_context_list.c | 11 ++++++-----
|
||||
libselinux/src/query_user_context.c | 2 +-
|
||||
4 files changed, 9 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/libselinux/include/selinux/context.h b/libselinux/include/selinux/context.h
|
||||
index 949fb1e14cac..82f4e690faa8 100644
|
||||
--- a/libselinux/include/selinux/context.h
|
||||
+++ b/libselinux/include/selinux/context.h
|
||||
@@ -25,7 +25,7 @@ extern "C" {
|
||||
* for the same context_t*
|
||||
*/
|
||||
|
||||
- extern char *context_str(context_t);
|
||||
+ extern const char *context_str(context_t);
|
||||
|
||||
/* Free the storage used by a context */
|
||||
extern void context_free(context_t);
|
||||
diff --git a/libselinux/src/context.c b/libselinux/src/context.c
|
||||
index b2144c7cf76c..9dddbc5aa431 100644
|
||||
--- a/libselinux/src/context.c
|
||||
+++ b/libselinux/src/context.c
|
||||
@@ -116,7 +116,7 @@ void context_free(context_t context)
|
||||
/*
|
||||
* Return a pointer to the string value of the context.
|
||||
*/
|
||||
-char *context_str(context_t context)
|
||||
+const char *context_str(context_t context)
|
||||
{
|
||||
context_private_t *n = context->ptr;
|
||||
int i;
|
||||
diff --git a/libselinux/src/get_context_list.c b/libselinux/src/get_context_list.c
|
||||
index cfe38e59b207..d774b9cf604b 100644
|
||||
--- a/libselinux/src/get_context_list.c
|
||||
+++ b/libselinux/src/get_context_list.c
|
||||
@@ -143,6 +143,7 @@ static int get_context_user(FILE * fp,
|
||||
char *linerole, *linetype;
|
||||
char **new_reachable = NULL;
|
||||
char *usercon_str;
|
||||
+ const char *usercon_str2;
|
||||
context_t con;
|
||||
context_t usercon;
|
||||
|
||||
@@ -257,20 +258,20 @@ static int get_context_user(FILE * fp,
|
||||
rc = -1;
|
||||
goto out;
|
||||
}
|
||||
- usercon_str = context_str(usercon);
|
||||
- if (!usercon_str) {
|
||||
+ usercon_str2 = context_str(usercon);
|
||||
+ if (!usercon_str2) {
|
||||
context_free(usercon);
|
||||
rc = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* check whether usercon is already in reachable */
|
||||
- if (is_in_reachable(*reachable, usercon_str)) {
|
||||
+ if (is_in_reachable(*reachable, usercon_str2)) {
|
||||
context_free(usercon);
|
||||
start = end;
|
||||
continue;
|
||||
}
|
||||
- if (security_check_context(usercon_str) == 0) {
|
||||
+ if (security_check_context(usercon_str2) == 0) {
|
||||
new_reachable = realloc(*reachable, (*nreachable + 2) * sizeof(char *));
|
||||
if (!new_reachable) {
|
||||
context_free(usercon);
|
||||
@@ -278,7 +279,7 @@ static int get_context_user(FILE * fp,
|
||||
goto out;
|
||||
}
|
||||
*reachable = new_reachable;
|
||||
- new_reachable[*nreachable] = strdup(usercon_str);
|
||||
+ new_reachable[*nreachable] = strdup(usercon_str2);
|
||||
if (new_reachable[*nreachable] == NULL) {
|
||||
context_free(usercon);
|
||||
rc = -1;
|
||||
diff --git a/libselinux/src/query_user_context.c b/libselinux/src/query_user_context.c
|
||||
index b8125c96ed81..29a1b360e945 100644
|
||||
--- a/libselinux/src/query_user_context.c
|
||||
+++ b/libselinux/src/query_user_context.c
|
||||
@@ -115,7 +115,7 @@ int manual_user_enter_context(const char *user, char ** newcon)
|
||||
int mls_enabled = is_selinux_mls_enabled();
|
||||
|
||||
context_t new_context; /* The new context chosen by the user */
|
||||
- char *user_context = NULL; /* String value of the user's context */
|
||||
+ const char *user_context = NULL; /* String value of the user's context */
|
||||
int done = 0; /* true if a valid sid has been obtained */
|
||||
|
||||
/* Initialize the context. How this is done depends on whether
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,173 +0,0 @@
|
||||
From de285252a1801397306032e070793889c9466845 Mon Sep 17 00:00:00 2001
|
||||
From: Petr Lautrbach <plautrba@redhat.com>
|
||||
Date: Tue, 31 May 2022 14:57:51 +0200
|
||||
Subject: [PATCH] Revert "libselinux: restorecon: pin file to avoid TOCTOU
|
||||
issues"
|
||||
Content-type: text/plain
|
||||
|
||||
This reverts commit 7e979b56fd2cee28f647376a7233d2ac2d12ca50.
|
||||
|
||||
The reverted commit broke `setfiles` when it's run from a chroot
|
||||
without /proc mounted, e.g.
|
||||
|
||||
# chroot /mnt/sysimage
|
||||
|
||||
chroot# setfiles -e /proc -e /sys /sys /etc/selinux/targeted/contexts/files/file_contexts /
|
||||
[strace]
|
||||
openat(AT_FDCWD, "/", O_RDONLY|O_EXCL|O_NOFOLLOW|O_PATH) = 3
|
||||
newfstatat(3, "", {st_mode=S_IFDIR|0555, st_size=4096, ...}, AT_EMPTY_PATH) = 0
|
||||
mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1697c91000
|
||||
fgetxattr(3, "security.selinux", 0x55be8881d3f0, 255) = -1 EBADF (Bad file descriptor)
|
||||
fcntl(3, F_GETFL) = 0x220000 (flags O_RDONLY|O_NOFOLLOW|O_PATH)
|
||||
getxattr("/proc/self/fd/3", "security.selinux", 0x55be8881d3f0, 255) = -1 ENOENT (No such file or directory)
|
||||
[/strace]
|
||||
setfiles: Could not set context for /: No such file or directory
|
||||
|
||||
Signed-off-by: Petr Lautrbach <plautrba@redhat.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/src/selinux_restorecon.c | 43 ++++++++++++-----------------
|
||||
1 file changed, 18 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/libselinux/src/selinux_restorecon.c b/libselinux/src/selinux_restorecon.c
|
||||
index 9dd6be817832..9f5b326c19ec 100644
|
||||
--- a/libselinux/src/selinux_restorecon.c
|
||||
+++ b/libselinux/src/selinux_restorecon.c
|
||||
@@ -623,13 +623,13 @@ out:
|
||||
return rc;
|
||||
}
|
||||
|
||||
-static int restorecon_sb(const char *pathname, struct rest_flags *flags, bool first)
|
||||
+static int restorecon_sb(const char *pathname, const struct stat *sb,
|
||||
+ struct rest_flags *flags, bool first)
|
||||
{
|
||||
char *newcon = NULL;
|
||||
char *curcon = NULL;
|
||||
char *newtypecon = NULL;
|
||||
- int fd = -1, rc;
|
||||
- struct stat stat_buf;
|
||||
+ int rc;
|
||||
bool updated = false;
|
||||
const char *lookup_path = pathname;
|
||||
float pc;
|
||||
@@ -644,21 +644,13 @@ static int restorecon_sb(const char *pathname, struct rest_flags *flags, bool fi
|
||||
lookup_path += rootpathlen;
|
||||
}
|
||||
|
||||
- fd = open(pathname, O_PATH | O_NOFOLLOW | O_EXCL);
|
||||
- if (fd < 0)
|
||||
- goto err;
|
||||
-
|
||||
- rc = fstat(fd, &stat_buf);
|
||||
- if (rc < 0)
|
||||
- goto err;
|
||||
-
|
||||
if (rootpath != NULL && lookup_path[0] == '\0')
|
||||
/* this is actually the root dir of the alt root. */
|
||||
rc = selabel_lookup_raw(fc_sehandle, &newcon, "/",
|
||||
- stat_buf.st_mode);
|
||||
+ sb->st_mode);
|
||||
else
|
||||
rc = selabel_lookup_raw(fc_sehandle, &newcon, lookup_path,
|
||||
- stat_buf.st_mode);
|
||||
+ sb->st_mode);
|
||||
|
||||
if (rc < 0) {
|
||||
if (errno == ENOENT) {
|
||||
@@ -667,10 +659,10 @@ static int restorecon_sb(const char *pathname, struct rest_flags *flags, bool fi
|
||||
"Warning no default label for %s\n",
|
||||
lookup_path);
|
||||
|
||||
- goto out; /* no match, but not an error */
|
||||
+ return 0; /* no match, but not an error */
|
||||
}
|
||||
|
||||
- goto err;
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
if (flags->progress) {
|
||||
@@ -690,17 +682,19 @@ static int restorecon_sb(const char *pathname, struct rest_flags *flags, bool fi
|
||||
}
|
||||
|
||||
if (flags->add_assoc) {
|
||||
- rc = filespec_add(stat_buf.st_ino, newcon, pathname, flags);
|
||||
+ rc = filespec_add(sb->st_ino, newcon, pathname, flags);
|
||||
|
||||
if (rc < 0) {
|
||||
selinux_log(SELINUX_ERROR,
|
||||
"filespec_add error: %s\n", pathname);
|
||||
- goto out1;
|
||||
+ freecon(newcon);
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
if (rc > 0) {
|
||||
/* Already an association and it took precedence. */
|
||||
- goto out;
|
||||
+ freecon(newcon);
|
||||
+ return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -708,7 +702,7 @@ static int restorecon_sb(const char *pathname, struct rest_flags *flags, bool fi
|
||||
selinux_log(SELINUX_INFO, "%s matched by %s\n",
|
||||
pathname, newcon);
|
||||
|
||||
- if (fgetfilecon_raw(fd, &curcon) < 0) {
|
||||
+ if (lgetfilecon_raw(pathname, &curcon) < 0) {
|
||||
if (errno != ENODATA)
|
||||
goto err;
|
||||
|
||||
@@ -741,7 +735,7 @@ static int restorecon_sb(const char *pathname, struct rest_flags *flags, bool fi
|
||||
}
|
||||
|
||||
if (!flags->nochange) {
|
||||
- if (fsetfilecon(fd, newcon) < 0)
|
||||
+ if (lsetfilecon(pathname, newcon) < 0)
|
||||
goto err;
|
||||
updated = true;
|
||||
}
|
||||
@@ -766,8 +760,6 @@ static int restorecon_sb(const char *pathname, struct rest_flags *flags, bool fi
|
||||
out:
|
||||
rc = 0;
|
||||
out1:
|
||||
- if (fd >= 0)
|
||||
- close(fd);
|
||||
freecon(curcon);
|
||||
freecon(newcon);
|
||||
return rc;
|
||||
@@ -865,6 +857,7 @@ static void *selinux_restorecon_thread(void *arg)
|
||||
FTSENT *ftsent;
|
||||
int error;
|
||||
char ent_path[PATH_MAX];
|
||||
+ struct stat ent_st;
|
||||
bool first = false;
|
||||
|
||||
if (state->parallel)
|
||||
@@ -962,11 +955,11 @@ loop_body:
|
||||
/* fall through */
|
||||
default:
|
||||
strcpy(ent_path, ftsent->fts_path);
|
||||
-
|
||||
+ ent_st = *ftsent->fts_statp;
|
||||
if (state->parallel)
|
||||
pthread_mutex_unlock(&state->mutex);
|
||||
|
||||
- error = restorecon_sb(ent_path, &state->flags,
|
||||
+ error = restorecon_sb(ent_path, &ent_st, &state->flags,
|
||||
first);
|
||||
|
||||
if (state->parallel) {
|
||||
@@ -1162,7 +1155,7 @@ static int selinux_restorecon_common(const char *pathname_orig,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
- error = restorecon_sb(pathname, &state.flags, true);
|
||||
+ error = restorecon_sb(pathname, &sb, &state.flags, true);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,323 +0,0 @@
|
||||
From c8ba7968b3abb1e17edd400bb795d5e452b57935 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Iooss <nicolas.iooss@m4x.org>
|
||||
Date: Sun, 29 May 2022 20:01:11 +0200
|
||||
Subject: [PATCH] libselinux: do not return the cached prev_current value when
|
||||
using getpidcon()
|
||||
Content-type: text/plain
|
||||
|
||||
libselinux implements a cache mechanism for get*con() functions, such
|
||||
that when a thread calls setcon(...) then getcon(...), the context is
|
||||
directly returned. Unfortunately, getpidcon(pid, &context) uses the same
|
||||
cached variable, so when a program uses setcon("something"), all later
|
||||
calls to getpidcon(pid, ...) returns "something". This is a bug.
|
||||
|
||||
Here is a program which illustrates this bug:
|
||||
|
||||
#include <stdio.h>
|
||||
#include <selinux/selinux.h>
|
||||
|
||||
int main() {
|
||||
char *context = "";
|
||||
if (getpidcon(1, &context) < 0) {
|
||||
perror("getpidcon(1)");
|
||||
}
|
||||
printf("getpidcon(1) = %s\n", context);
|
||||
|
||||
if (getcon(&context) < 0) {
|
||||
perror("getcon()");
|
||||
}
|
||||
printf("getcon() = %s\n", context);
|
||||
if (setcon(context) < 0) {
|
||||
perror("setcon()");
|
||||
}
|
||||
if (getpidcon(1, &context) < 0) {
|
||||
perror("getpidcon(1)");
|
||||
}
|
||||
printf("getpidcon(1) = %s\n", context);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
On an Arch Linux system using unconfined user, this program displays:
|
||||
|
||||
getpidcon(1) = system_u:system_r:init_t
|
||||
getcon() = unconfined_u:unconfined_r:unconfined_t
|
||||
getpidcon(1) = unconfined_u:unconfined_r:unconfined_t
|
||||
|
||||
With this commit, this program displays:
|
||||
|
||||
getpidcon(1) = system_u:system_r:init_t
|
||||
getcon() = unconfined_u:unconfined_r:unconfined_t
|
||||
getpidcon(1) = system_u:system_r:init_t
|
||||
|
||||
This bug was present in the first commit of
|
||||
https://github.com/SELinuxProject/selinux git history. It was reported
|
||||
in https://lore.kernel.org/selinux/20220121084012.GS7643@suse.com/ and a
|
||||
patch to fix it was sent in
|
||||
https://patchwork.kernel.org/project/selinux/patch/20220127130741.31940-1-jsegitz@suse.de/
|
||||
without a clear explanation. This patch added pid checks, which made
|
||||
sense but were difficult to read. Instead, it is possible to change the
|
||||
way the functions are called so that they directly know which cache
|
||||
variable to use.
|
||||
|
||||
Moreover, as the code is not clear at all (I spent too much time trying
|
||||
to understand what the switch did and what the thread-local variable
|
||||
contained), this commit also reworks libselinux/src/procattr.c to:
|
||||
- not use hard-to-understand switch/case constructions on strings (they
|
||||
are replaced by a new argument filled by macros)
|
||||
- remove getpidattr_def macro (it was only used once, for pidcon, and
|
||||
the code is clearer with one less macro)
|
||||
- remove the pid parameter of setprocattrcon() and setprocattrcon_raw()
|
||||
(it is always zero)
|
||||
|
||||
Signed-off-by: Nicolas Iooss <nicolas.iooss@m4x.org>
|
||||
Cc: Johannes Segitz <jsegitz@suse.de>
|
||||
---
|
||||
libselinux/src/procattr.c | 147 +++++++++++++-------------------------
|
||||
1 file changed, 50 insertions(+), 97 deletions(-)
|
||||
|
||||
diff --git a/libselinux/src/procattr.c b/libselinux/src/procattr.c
|
||||
index 142fbf3a80e0..6f4cfb82479d 100644
|
||||
--- a/libselinux/src/procattr.c
|
||||
+++ b/libselinux/src/procattr.c
|
||||
@@ -11,11 +11,14 @@
|
||||
|
||||
#define UNSET (char *) -1
|
||||
|
||||
+/* Cached values so that when a thread calls set*con() then gen*con(), the value
|
||||
+ * which was set is directly returned.
|
||||
+ */
|
||||
static __thread char *prev_current = UNSET;
|
||||
-static __thread char * prev_exec = UNSET;
|
||||
-static __thread char * prev_fscreate = UNSET;
|
||||
-static __thread char * prev_keycreate = UNSET;
|
||||
-static __thread char * prev_sockcreate = UNSET;
|
||||
+static __thread char *prev_exec = UNSET;
|
||||
+static __thread char *prev_fscreate = UNSET;
|
||||
+static __thread char *prev_keycreate = UNSET;
|
||||
+static __thread char *prev_sockcreate = UNSET;
|
||||
|
||||
static pthread_once_t once = PTHREAD_ONCE_INIT;
|
||||
static pthread_key_t destructor_key;
|
||||
@@ -111,43 +114,18 @@ out:
|
||||
return fd;
|
||||
}
|
||||
|
||||
-static int getprocattrcon_raw(char ** context,
|
||||
- pid_t pid, const char *attr)
|
||||
+static int getprocattrcon_raw(char **context, pid_t pid, const char *attr,
|
||||
+ const char *prev_context)
|
||||
{
|
||||
char *buf;
|
||||
size_t size;
|
||||
int fd;
|
||||
ssize_t ret;
|
||||
int errno_hold;
|
||||
- char * prev_context;
|
||||
|
||||
__selinux_once(once, init_procattr);
|
||||
init_thread_destructor();
|
||||
|
||||
- switch (attr[0]) {
|
||||
- case 'c':
|
||||
- prev_context = prev_current;
|
||||
- break;
|
||||
- case 'e':
|
||||
- prev_context = prev_exec;
|
||||
- break;
|
||||
- case 'f':
|
||||
- prev_context = prev_fscreate;
|
||||
- break;
|
||||
- case 'k':
|
||||
- prev_context = prev_keycreate;
|
||||
- break;
|
||||
- case 's':
|
||||
- prev_context = prev_sockcreate;
|
||||
- break;
|
||||
- case 'p':
|
||||
- prev_context = NULL;
|
||||
- break;
|
||||
- default:
|
||||
- errno = ENOENT;
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
if (prev_context && prev_context != UNSET) {
|
||||
*context = strdup(prev_context);
|
||||
if (!(*context)) {
|
||||
@@ -194,13 +172,13 @@ static int getprocattrcon_raw(char ** context,
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int getprocattrcon(char ** context,
|
||||
- pid_t pid, const char *attr)
|
||||
+static int getprocattrcon(char **context, pid_t pid, const char *attr,
|
||||
+ const char *prev_context)
|
||||
{
|
||||
int ret;
|
||||
char * rcontext;
|
||||
|
||||
- ret = getprocattrcon_raw(&rcontext, pid, attr);
|
||||
+ ret = getprocattrcon_raw(&rcontext, pid, attr, prev_context);
|
||||
|
||||
if (!ret) {
|
||||
ret = selinux_raw_to_trans_context(rcontext, context);
|
||||
@@ -210,45 +188,24 @@ static int getprocattrcon(char ** context,
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int setprocattrcon_raw(const char * context,
|
||||
- pid_t pid, const char *attr)
|
||||
+static int setprocattrcon_raw(const char *context, const char *attr,
|
||||
+ char **prev_context)
|
||||
{
|
||||
int fd;
|
||||
ssize_t ret;
|
||||
int errno_hold;
|
||||
- char **prev_context, *context2 = NULL;
|
||||
+ char *context2 = NULL;
|
||||
|
||||
__selinux_once(once, init_procattr);
|
||||
init_thread_destructor();
|
||||
|
||||
- switch (attr[0]) {
|
||||
- case 'c':
|
||||
- prev_context = &prev_current;
|
||||
- break;
|
||||
- case 'e':
|
||||
- prev_context = &prev_exec;
|
||||
- break;
|
||||
- case 'f':
|
||||
- prev_context = &prev_fscreate;
|
||||
- break;
|
||||
- case 'k':
|
||||
- prev_context = &prev_keycreate;
|
||||
- break;
|
||||
- case 's':
|
||||
- prev_context = &prev_sockcreate;
|
||||
- break;
|
||||
- default:
|
||||
- errno = ENOENT;
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
if (!context && !*prev_context)
|
||||
return 0;
|
||||
if (context && *prev_context && *prev_context != UNSET
|
||||
&& !strcmp(context, *prev_context))
|
||||
return 0;
|
||||
|
||||
- fd = openattr(pid, attr, O_RDWR | O_CLOEXEC);
|
||||
+ fd = openattr(0, attr, O_RDWR | O_CLOEXEC);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
if (context) {
|
||||
@@ -279,8 +236,8 @@ out:
|
||||
}
|
||||
}
|
||||
|
||||
-static int setprocattrcon(const char * context,
|
||||
- pid_t pid, const char *attr)
|
||||
+static int setprocattrcon(const char *context, const char *attr,
|
||||
+ char **prev_context)
|
||||
{
|
||||
int ret;
|
||||
char * rcontext;
|
||||
@@ -288,62 +245,58 @@ static int setprocattrcon(const char * context,
|
||||
if (selinux_trans_to_raw_context(context, &rcontext))
|
||||
return -1;
|
||||
|
||||
- ret = setprocattrcon_raw(rcontext, pid, attr);
|
||||
+ ret = setprocattrcon_raw(rcontext, attr, prev_context);
|
||||
|
||||
freecon(rcontext);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
-#define getselfattr_def(fn, attr) \
|
||||
+#define getselfattr_def(fn, attr, prev_context) \
|
||||
int get##fn##_raw(char **c) \
|
||||
{ \
|
||||
- return getprocattrcon_raw(c, 0, #attr); \
|
||||
+ return getprocattrcon_raw(c, 0, attr, prev_context); \
|
||||
} \
|
||||
int get##fn(char **c) \
|
||||
{ \
|
||||
- return getprocattrcon(c, 0, #attr); \
|
||||
+ return getprocattrcon(c, 0, attr, prev_context); \
|
||||
}
|
||||
|
||||
-#define setselfattr_def(fn, attr) \
|
||||
+#define setselfattr_def(fn, attr, prev_context) \
|
||||
int set##fn##_raw(const char * c) \
|
||||
{ \
|
||||
- return setprocattrcon_raw(c, 0, #attr); \
|
||||
+ return setprocattrcon_raw(c, attr, &prev_context); \
|
||||
} \
|
||||
int set##fn(const char * c) \
|
||||
{ \
|
||||
- return setprocattrcon(c, 0, #attr); \
|
||||
+ return setprocattrcon(c, attr, &prev_context); \
|
||||
}
|
||||
|
||||
-#define all_selfattr_def(fn, attr) \
|
||||
- getselfattr_def(fn, attr) \
|
||||
- setselfattr_def(fn, attr)
|
||||
+#define all_selfattr_def(fn, attr, prev_context) \
|
||||
+ getselfattr_def(fn, attr, prev_context) \
|
||||
+ setselfattr_def(fn, attr, prev_context)
|
||||
|
||||
-#define getpidattr_def(fn, attr) \
|
||||
- int get##fn##_raw(pid_t pid, char **c) \
|
||||
- { \
|
||||
- if (pid <= 0) { \
|
||||
- errno = EINVAL; \
|
||||
- return -1; \
|
||||
- } else { \
|
||||
- return getprocattrcon_raw(c, pid, #attr); \
|
||||
- } \
|
||||
- } \
|
||||
- int get##fn(pid_t pid, char **c) \
|
||||
- { \
|
||||
- if (pid <= 0) { \
|
||||
- errno = EINVAL; \
|
||||
- return -1; \
|
||||
- } else { \
|
||||
- return getprocattrcon(c, pid, #attr); \
|
||||
- } \
|
||||
- }
|
||||
+all_selfattr_def(con, "current", prev_current)
|
||||
+ getselfattr_def(prevcon, "prev", NULL)
|
||||
+ all_selfattr_def(execcon, "exec", prev_exec)
|
||||
+ all_selfattr_def(fscreatecon, "fscreate", prev_fscreate)
|
||||
+ all_selfattr_def(sockcreatecon, "sockcreate", prev_sockcreate)
|
||||
+ all_selfattr_def(keycreatecon, "keycreate", prev_keycreate)
|
||||
|
||||
-all_selfattr_def(con, current)
|
||||
- getpidattr_def(pidcon, current)
|
||||
- getselfattr_def(prevcon, prev)
|
||||
- all_selfattr_def(execcon, exec)
|
||||
- all_selfattr_def(fscreatecon, fscreate)
|
||||
- all_selfattr_def(sockcreatecon, sockcreate)
|
||||
- all_selfattr_def(keycreatecon, keycreate)
|
||||
+int getpidcon_raw(pid_t pid, char **c)
|
||||
+{
|
||||
+ if (pid <= 0) {
|
||||
+ errno = EINVAL;
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return getprocattrcon_raw(c, pid, "current", NULL);
|
||||
+}
|
||||
|
||||
+int getpidcon(pid_t pid, char **c)
|
||||
+{
|
||||
+ if (pid <= 0) {
|
||||
+ errno = EINVAL;
|
||||
+ return -1;
|
||||
+ }
|
||||
+ return getprocattrcon(c, pid, "current", NULL);
|
||||
+}
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,89 +0,0 @@
|
||||
From 31e3537624ad2d07271d4c02925ebc6cb942e0c6 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Tue, 10 May 2022 20:20:36 +0200
|
||||
Subject: [PATCH] libselinux: simplify policy path logic to avoid uninitialized
|
||||
read
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
In case the function __policy_init() gets called with a NULL pointer,
|
||||
the stack variable path remains uninitialized (except at its last
|
||||
index). If parsing the binary policy fails in sepol_policydb_read() the
|
||||
error branch would access those uninitialized memory.
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
---
|
||||
libselinux/src/audit2why.c | 34 +++++++++++++---------------------
|
||||
1 file changed, 13 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/libselinux/src/audit2why.c b/libselinux/src/audit2why.c
|
||||
index ca38e13c0eeb..44a9a3419f96 100644
|
||||
--- a/libselinux/src/audit2why.c
|
||||
+++ b/libselinux/src/audit2why.c
|
||||
@@ -192,25 +192,16 @@ static PyObject *finish(PyObject *self __attribute__((unused)), PyObject *args)
|
||||
static int __policy_init(const char *init_path)
|
||||
{
|
||||
FILE *fp;
|
||||
- char path[PATH_MAX];
|
||||
+ const char *curpolicy;
|
||||
char errormsg[PATH_MAX+1024+20];
|
||||
struct sepol_policy_file *pf = NULL;
|
||||
int rc;
|
||||
unsigned int cnt;
|
||||
|
||||
- path[PATH_MAX-1] = '\0';
|
||||
if (init_path) {
|
||||
- strncpy(path, init_path, PATH_MAX-1);
|
||||
- fp = fopen(path, "re");
|
||||
- if (!fp) {
|
||||
- snprintf(errormsg, sizeof(errormsg),
|
||||
- "unable to open %s: %m\n",
|
||||
- path);
|
||||
- PyErr_SetString( PyExc_ValueError, errormsg);
|
||||
- return 1;
|
||||
- }
|
||||
+ curpolicy = init_path;
|
||||
} else {
|
||||
- const char *curpolicy = selinux_current_policy_path();
|
||||
+ curpolicy = selinux_current_policy_path();
|
||||
if (!curpolicy) {
|
||||
/* SELinux disabled, must use -p option. */
|
||||
snprintf(errormsg, sizeof(errormsg),
|
||||
@@ -218,14 +209,15 @@ static int __policy_init(const char *init_path)
|
||||
PyErr_SetString( PyExc_ValueError, errormsg);
|
||||
return 1;
|
||||
}
|
||||
- fp = fopen(curpolicy, "re");
|
||||
- if (!fp) {
|
||||
- snprintf(errormsg, sizeof(errormsg),
|
||||
- "unable to open %s: %m\n",
|
||||
- curpolicy);
|
||||
- PyErr_SetString( PyExc_ValueError, errormsg);
|
||||
- return 1;
|
||||
- }
|
||||
+ }
|
||||
+
|
||||
+ fp = fopen(curpolicy, "re");
|
||||
+ if (!fp) {
|
||||
+ snprintf(errormsg, sizeof(errormsg),
|
||||
+ "unable to open %s: %m\n",
|
||||
+ curpolicy);
|
||||
+ PyErr_SetString( PyExc_ValueError, errormsg);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
avc = calloc(sizeof(struct avc_t), 1);
|
||||
@@ -249,7 +241,7 @@ static int __policy_init(const char *init_path)
|
||||
sepol_policy_file_set_fp(pf, fp);
|
||||
if (sepol_policydb_read(avc->policydb, pf)) {
|
||||
snprintf(errormsg, sizeof(errormsg),
|
||||
- "invalid binary policy %s\n", path);
|
||||
+ "invalid binary policy %s\n", curpolicy);
|
||||
PyErr_SetString( PyExc_ValueError, errormsg);
|
||||
fclose(fp);
|
||||
return 1;
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,34 +0,0 @@
|
||||
From 2b7da165955f359eb8200a5b0f15a8c81234c543 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Tue, 10 May 2022 20:20:37 +0200
|
||||
Subject: [PATCH] libselinux: add header guard for internal header
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
---
|
||||
libselinux/src/selinux_internal.h | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/libselinux/src/selinux_internal.h b/libselinux/src/selinux_internal.h
|
||||
index 297dcf26dee3..9f4c90739171 100644
|
||||
--- a/libselinux/src/selinux_internal.h
|
||||
+++ b/libselinux/src/selinux_internal.h
|
||||
@@ -1,3 +1,6 @@
|
||||
+#ifndef SELINUX_INTERNAL_H_
|
||||
+#define SELINUX_INTERNAL_H_
|
||||
+
|
||||
#include <selinux/selinux.h>
|
||||
#include <pthread.h>
|
||||
|
||||
@@ -90,3 +93,5 @@ extern int selinux_page_size ;
|
||||
#define SELINUXCONFIG SELINUXDIR "config"
|
||||
|
||||
extern int has_selinux_config ;
|
||||
+
|
||||
+#endif /* SELINUX_INTERNAL_H_ */
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,78 +0,0 @@
|
||||
From 7d5a89314be88b3085cfdf6083837045a5e44aa9 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Tue, 10 May 2022 20:20:38 +0200
|
||||
Subject: [PATCH] libselinux: introduce strlcpy
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
To copy string safely, by always NULL-terminating them, and provide an
|
||||
easy way to check for truncation introduce the nonstandard function
|
||||
strlcpy(3). Use the system implementation if available.
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
---
|
||||
libselinux/src/Makefile | 6 ++++++
|
||||
libselinux/src/selinux_internal.c | 18 ++++++++++++++++++
|
||||
libselinux/src/selinux_internal.h | 4 ++++
|
||||
3 files changed, 28 insertions(+)
|
||||
create mode 100644 libselinux/src/selinux_internal.c
|
||||
|
||||
diff --git a/libselinux/src/Makefile b/libselinux/src/Makefile
|
||||
index 04bf4f240168..88aa32f80944 100644
|
||||
--- a/libselinux/src/Makefile
|
||||
+++ b/libselinux/src/Makefile
|
||||
@@ -103,6 +103,12 @@ FTS_LDLIBS ?=
|
||||
|
||||
override CFLAGS += -I../include -D_GNU_SOURCE $(DISABLE_FLAGS) $(PCRE_CFLAGS)
|
||||
|
||||
+# check for strlcpy(3) availability
|
||||
+H := \#
|
||||
+ifeq (yes,$(shell printf '${H}include <string.h>\nint main(void){char*d,*s;strlcpy(d, s, 0);return 0;}' | $(CC) -x c -o /dev/null - >/dev/null 2>&1 && echo yes))
|
||||
+override CFLAGS += -DHAVE_STRLCPY
|
||||
+endif
|
||||
+
|
||||
SWIG_CFLAGS += -Wno-error -Wno-unused-variable -Wno-unused-but-set-variable -Wno-unused-parameter \
|
||||
-Wno-shadow -Wno-uninitialized -Wno-missing-prototypes -Wno-missing-declarations \
|
||||
-Wno-deprecated-declarations
|
||||
diff --git a/libselinux/src/selinux_internal.c b/libselinux/src/selinux_internal.c
|
||||
new file mode 100644
|
||||
index 000000000000..c2be7c0a9128
|
||||
--- /dev/null
|
||||
+++ b/libselinux/src/selinux_internal.c
|
||||
@@ -0,0 +1,18 @@
|
||||
+#include "selinux_internal.h"
|
||||
+
|
||||
+#include <string.h>
|
||||
+
|
||||
+
|
||||
+#ifndef HAVE_STRLCPY
|
||||
+size_t strlcpy(char *dest, const char *src, size_t size)
|
||||
+{
|
||||
+ size_t ret = strlen(src);
|
||||
+
|
||||
+ if (size) {
|
||||
+ size_t len = (ret >= size) ? size - 1 : ret;
|
||||
+ memcpy(dest, src, len);
|
||||
+ dest[len] = '\0';
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+#endif /* HAVE_STRLCPY */
|
||||
diff --git a/libselinux/src/selinux_internal.h b/libselinux/src/selinux_internal.h
|
||||
index 9f4c90739171..06f2c0383bc2 100644
|
||||
--- a/libselinux/src/selinux_internal.h
|
||||
+++ b/libselinux/src/selinux_internal.h
|
||||
@@ -94,4 +94,8 @@ extern int selinux_page_size ;
|
||||
|
||||
extern int has_selinux_config ;
|
||||
|
||||
+#ifndef HAVE_STRLCPY
|
||||
+size_t strlcpy(char *dest, const char *src, size_t size);
|
||||
+#endif
|
||||
+
|
||||
#endif /* SELINUX_INTERNAL_H_ */
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,182 +0,0 @@
|
||||
From 1eb6229a48d2b8ca08a230e7c60176c56c5cb6d5 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Tue, 7 Jun 2022 19:14:09 +0200
|
||||
Subject: [PATCH] libselinux: check for truncations
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
Check for truncations when building or copying strings involving user
|
||||
input.
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
---
|
||||
libselinux/src/canonicalize_context.c | 6 +++++-
|
||||
libselinux/src/compute_av.c | 8 +++++++-
|
||||
libselinux/src/compute_create.c | 7 +++++++
|
||||
libselinux/src/compute_member.c | 8 +++++++-
|
||||
libselinux/src/compute_relabel.c | 8 +++++++-
|
||||
libselinux/src/compute_user.c | 8 +++++++-
|
||||
libselinux/src/selinux_restorecon.c | 11 ++++++++++-
|
||||
libselinux/src/setrans_client.c | 8 +++++++-
|
||||
8 files changed, 57 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/libselinux/src/canonicalize_context.c b/libselinux/src/canonicalize_context.c
|
||||
index faab730592c2..6af8491dd4a6 100644
|
||||
--- a/libselinux/src/canonicalize_context.c
|
||||
+++ b/libselinux/src/canonicalize_context.c
|
||||
@@ -33,7 +33,11 @@ int security_canonicalize_context_raw(const char * con,
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
- strncpy(buf, con, size);
|
||||
+ if (strlcpy(buf, con, size) >= size) {
|
||||
+ errno = EOVERFLOW;
|
||||
+ ret = -1;
|
||||
+ goto out2;
|
||||
+ }
|
||||
|
||||
ret = write(fd, buf, strlen(buf) + 1);
|
||||
if (ret < 0)
|
||||
diff --git a/libselinux/src/compute_av.c b/libselinux/src/compute_av.c
|
||||
index 9d17339d1a32..354a19e1051c 100644
|
||||
--- a/libselinux/src/compute_av.c
|
||||
+++ b/libselinux/src/compute_av.c
|
||||
@@ -40,8 +40,14 @@ int security_compute_av_flags_raw(const char * scon,
|
||||
}
|
||||
|
||||
kclass = unmap_class(tclass);
|
||||
- snprintf(buf, len, "%s %s %hu %x", scon, tcon,
|
||||
+
|
||||
+ ret = snprintf(buf, len, "%s %s %hu %x", scon, tcon,
|
||||
kclass, unmap_perm(tclass, requested));
|
||||
+ if (ret < 0 || (size_t)ret >= len) {
|
||||
+ errno = EOVERFLOW;
|
||||
+ ret = -1;
|
||||
+ goto out2;
|
||||
+ }
|
||||
|
||||
ret = write(fd, buf, strlen(buf));
|
||||
if (ret < 0)
|
||||
diff --git a/libselinux/src/compute_create.c b/libselinux/src/compute_create.c
|
||||
index 1d75714d852d..e9f3c96a1a6a 100644
|
||||
--- a/libselinux/src/compute_create.c
|
||||
+++ b/libselinux/src/compute_create.c
|
||||
@@ -75,8 +75,15 @@ int security_compute_create_name_raw(const char * scon,
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
+
|
||||
len = snprintf(buf, size, "%s %s %hu",
|
||||
scon, tcon, unmap_class(tclass));
|
||||
+ if (len < 0 || (size_t)len >= size) {
|
||||
+ errno = EOVERFLOW;
|
||||
+ ret = -1;
|
||||
+ goto out2;
|
||||
+ }
|
||||
+
|
||||
if (objname &&
|
||||
object_name_encode(objname, buf + len, size - len) < 0) {
|
||||
errno = ENAMETOOLONG;
|
||||
diff --git a/libselinux/src/compute_member.c b/libselinux/src/compute_member.c
|
||||
index 16234b7908f2..53d2f55950f6 100644
|
||||
--- a/libselinux/src/compute_member.c
|
||||
+++ b/libselinux/src/compute_member.c
|
||||
@@ -36,7 +36,13 @@ int security_compute_member_raw(const char * scon,
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
- snprintf(buf, size, "%s %s %hu", scon, tcon, unmap_class(tclass));
|
||||
+
|
||||
+ ret = snprintf(buf, size, "%s %s %hu", scon, tcon, unmap_class(tclass));
|
||||
+ if (ret < 0 || (size_t)ret >= size) {
|
||||
+ errno = EOVERFLOW;
|
||||
+ ret = -1;
|
||||
+ goto out2;
|
||||
+ }
|
||||
|
||||
ret = write(fd, buf, strlen(buf));
|
||||
if (ret < 0)
|
||||
diff --git a/libselinux/src/compute_relabel.c b/libselinux/src/compute_relabel.c
|
||||
index dd20d6525993..9c0a2304f356 100644
|
||||
--- a/libselinux/src/compute_relabel.c
|
||||
+++ b/libselinux/src/compute_relabel.c
|
||||
@@ -36,7 +36,13 @@ int security_compute_relabel_raw(const char * scon,
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
- snprintf(buf, size, "%s %s %hu", scon, tcon, unmap_class(tclass));
|
||||
+
|
||||
+ ret = snprintf(buf, size, "%s %s %hu", scon, tcon, unmap_class(tclass));
|
||||
+ if (ret < 0 || (size_t)ret >= size) {
|
||||
+ errno = EOVERFLOW;
|
||||
+ ret = -1;
|
||||
+ goto out2;
|
||||
+ }
|
||||
|
||||
ret = write(fd, buf, strlen(buf));
|
||||
if (ret < 0)
|
||||
diff --git a/libselinux/src/compute_user.c b/libselinux/src/compute_user.c
|
||||
index ae5e7b4a8f68..f55f945a01e0 100644
|
||||
--- a/libselinux/src/compute_user.c
|
||||
+++ b/libselinux/src/compute_user.c
|
||||
@@ -38,7 +38,13 @@ int security_compute_user_raw(const char * scon,
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
- snprintf(buf, size, "%s %s", scon, user);
|
||||
+
|
||||
+ ret = snprintf(buf, size, "%s %s", scon, user);
|
||||
+ if (ret < 0 || (size_t)ret >= size) {
|
||||
+ errno = EOVERFLOW;
|
||||
+ ret = -1;
|
||||
+ goto out2;
|
||||
+ }
|
||||
|
||||
ret = write(fd, buf, strlen(buf));
|
||||
if (ret < 0)
|
||||
diff --git a/libselinux/src/selinux_restorecon.c b/libselinux/src/selinux_restorecon.c
|
||||
index 9f5b326c19ec..66e6a4a239d1 100644
|
||||
--- a/libselinux/src/selinux_restorecon.c
|
||||
+++ b/libselinux/src/selinux_restorecon.c
|
||||
@@ -954,7 +954,16 @@ loop_body:
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
- strcpy(ent_path, ftsent->fts_path);
|
||||
+ if (strlcpy(ent_path, ftsent->fts_path, sizeof(ent_path)) >= sizeof(ent_path)) {
|
||||
+ selinux_log(SELINUX_ERROR,
|
||||
+ "Path name too long on %s.\n",
|
||||
+ ftsent->fts_path);
|
||||
+ errno = ENAMETOOLONG;
|
||||
+ state->error = -1;
|
||||
+ state->abort = true;
|
||||
+ goto finish;
|
||||
+ }
|
||||
+
|
||||
ent_st = *ftsent->fts_statp;
|
||||
if (state->parallel)
|
||||
pthread_mutex_unlock(&state->mutex);
|
||||
diff --git a/libselinux/src/setrans_client.c b/libselinux/src/setrans_client.c
|
||||
index faa126813a77..920f9032c3f6 100644
|
||||
--- a/libselinux/src/setrans_client.c
|
||||
+++ b/libselinux/src/setrans_client.c
|
||||
@@ -66,7 +66,13 @@ static int setransd_open(void)
|
||||
|
||||
memset(&addr, 0, sizeof(addr));
|
||||
addr.sun_family = AF_UNIX;
|
||||
- strncpy(addr.sun_path, SETRANS_UNIX_SOCKET, sizeof(addr.sun_path));
|
||||
+
|
||||
+ if (strlcpy(addr.sun_path, SETRANS_UNIX_SOCKET, sizeof(addr.sun_path)) >= sizeof(addr.sun_path)) {
|
||||
+ close(fd);
|
||||
+ errno = EOVERFLOW;
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,70 +0,0 @@
|
||||
From 90bc03b732f51f7f7011d9bd80e589e64828dce3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Fri, 20 May 2022 15:08:44 +0200
|
||||
Subject: [PATCH] libselinux: add man page redirections
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
The following interfaces are documented but do not have a redirection:
|
||||
|
||||
- context_str(3)
|
||||
- security_get_checkreqprot(3)
|
||||
- security_set_boolean_list(3)
|
||||
- selinux_sepgsql_context_path(3)
|
||||
- setexecfilecon(3)
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/man/man3/context_str.3 | 1 +
|
||||
libselinux/man/man3/security_get_checkreqprot.3 | 1 +
|
||||
libselinux/man/man3/security_set_boolean_list.3 | 1 +
|
||||
libselinux/man/man3/selinux_sepgsql_context_path.3 | 1 +
|
||||
libselinux/man/man3/setexecfilecon.3 | 1 +
|
||||
5 files changed, 5 insertions(+)
|
||||
create mode 100644 libselinux/man/man3/context_str.3
|
||||
create mode 100644 libselinux/man/man3/security_get_checkreqprot.3
|
||||
create mode 100644 libselinux/man/man3/security_set_boolean_list.3
|
||||
create mode 100644 libselinux/man/man3/selinux_sepgsql_context_path.3
|
||||
create mode 100644 libselinux/man/man3/setexecfilecon.3
|
||||
|
||||
diff --git a/libselinux/man/man3/context_str.3 b/libselinux/man/man3/context_str.3
|
||||
new file mode 100644
|
||||
index 000000000000..f4f03a6d9cf3
|
||||
--- /dev/null
|
||||
+++ b/libselinux/man/man3/context_str.3
|
||||
@@ -0,0 +1 @@
|
||||
+.so man3/context_new.3
|
||||
diff --git a/libselinux/man/man3/security_get_checkreqprot.3 b/libselinux/man/man3/security_get_checkreqprot.3
|
||||
new file mode 100644
|
||||
index 000000000000..d59e5c2cc2e7
|
||||
--- /dev/null
|
||||
+++ b/libselinux/man/man3/security_get_checkreqprot.3
|
||||
@@ -0,0 +1 @@
|
||||
+.so man3/security_getenforce.3
|
||||
diff --git a/libselinux/man/man3/security_set_boolean_list.3 b/libselinux/man/man3/security_set_boolean_list.3
|
||||
new file mode 100644
|
||||
index 000000000000..29731efaecad
|
||||
--- /dev/null
|
||||
+++ b/libselinux/man/man3/security_set_boolean_list.3
|
||||
@@ -0,0 +1 @@
|
||||
+.so man3/security_load_booleans.3
|
||||
diff --git a/libselinux/man/man3/selinux_sepgsql_context_path.3 b/libselinux/man/man3/selinux_sepgsql_context_path.3
|
||||
new file mode 100644
|
||||
index 000000000000..175a611a3ef0
|
||||
--- /dev/null
|
||||
+++ b/libselinux/man/man3/selinux_sepgsql_context_path.3
|
||||
@@ -0,0 +1 @@
|
||||
+.so man3/selinux_binary_policy_path.3
|
||||
diff --git a/libselinux/man/man3/setexecfilecon.3 b/libselinux/man/man3/setexecfilecon.3
|
||||
new file mode 100644
|
||||
index 000000000000..b2e6ab8141ce
|
||||
--- /dev/null
|
||||
+++ b/libselinux/man/man3/setexecfilecon.3
|
||||
@@ -0,0 +1 @@
|
||||
+.so man3/getexeccon.3
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,33 +0,0 @@
|
||||
From 29e5233d85bb2f0c4ffc973f95faff8885a1c3dc Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Fri, 20 May 2022 15:08:45 +0200
|
||||
Subject: [PATCH] libselinux: enclose macro definition in parenthesis
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
Avoid potential precedence issues.
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/include/selinux/avc.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libselinux/include/selinux/avc.h b/libselinux/include/selinux/avc.h
|
||||
index 9b23357ad17f..4bbd2382404b 100644
|
||||
--- a/libselinux/include/selinux/avc.h
|
||||
+++ b/libselinux/include/selinux/avc.h
|
||||
@@ -24,7 +24,7 @@ struct security_id {
|
||||
};
|
||||
typedef struct security_id *security_id_t;
|
||||
|
||||
-#define SECSID_WILD (security_id_t)NULL /* unspecified SID */
|
||||
+#define SECSID_WILD ((security_id_t)NULL) /* unspecified SID */
|
||||
|
||||
/**
|
||||
* avc_sid_to_context - get copy of context corresponding to SID.
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,66 +0,0 @@
|
||||
From a6c572b1af14ae53b692c092fdc8838fe56ab3b3 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Tue, 7 Jun 2022 19:16:47 +0200
|
||||
Subject: [PATCH] libselinux: name parameters in context.h
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/include/selinux/context.h | 22 +++++++++++-----------
|
||||
1 file changed, 11 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/libselinux/include/selinux/context.h b/libselinux/include/selinux/context.h
|
||||
index 82f4e690faa8..59d9bb69ba7d 100644
|
||||
--- a/libselinux/include/selinux/context.h
|
||||
+++ b/libselinux/include/selinux/context.h
|
||||
@@ -17,7 +17,7 @@ extern "C" {
|
||||
|
||||
/* Return a new context initialized to a context string */
|
||||
|
||||
- extern context_t context_new(const char *);
|
||||
+ extern context_t context_new(const char *str);
|
||||
|
||||
/*
|
||||
* Return a pointer to the string value of the context_t
|
||||
@@ -25,24 +25,24 @@ extern "C" {
|
||||
* for the same context_t*
|
||||
*/
|
||||
|
||||
- extern const char *context_str(context_t);
|
||||
+ extern const char *context_str(context_t con);
|
||||
|
||||
/* Free the storage used by a context */
|
||||
- extern void context_free(context_t);
|
||||
+ extern void context_free(context_t con);
|
||||
|
||||
/* Get a pointer to the string value of a context component */
|
||||
|
||||
- extern const char *context_type_get(context_t);
|
||||
- extern const char *context_range_get(context_t);
|
||||
- extern const char *context_role_get(context_t);
|
||||
- extern const char *context_user_get(context_t);
|
||||
+ extern const char *context_type_get(context_t con);
|
||||
+ extern const char *context_range_get(context_t con);
|
||||
+ extern const char *context_role_get(context_t con);
|
||||
+ extern const char *context_user_get(context_t con);
|
||||
|
||||
/* Set a context component. Returns nonzero if unsuccessful */
|
||||
|
||||
- extern int context_type_set(context_t, const char *);
|
||||
- extern int context_range_set(context_t, const char *);
|
||||
- extern int context_role_set(context_t, const char *);
|
||||
- extern int context_user_set(context_t, const char *);
|
||||
+ extern int context_type_set(context_t con, const char *type);
|
||||
+ extern int context_range_set(context_t con, const char *range);
|
||||
+ extern int context_role_set(context_t con, const char *role);
|
||||
+ extern int context_user_set(context_t con, const char *user);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,63 +0,0 @@
|
||||
From c760a2bff627da1725fcd3569eacc79431bcdcf7 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Fri, 20 May 2022 15:08:47 +0200
|
||||
Subject: [PATCH] libselinux: declare parameter of security_load_policy(3)
|
||||
const
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
security_load_policy(3) takes a read-only memory address for a binary
|
||||
policy to be loaded.
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/include/selinux/selinux.h | 2 +-
|
||||
libselinux/man/man3/security_load_policy.3 | 2 +-
|
||||
libselinux/src/load_policy.c | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/libselinux/include/selinux/selinux.h b/libselinux/include/selinux/selinux.h
|
||||
index ae98a92e393e..47af99536798 100644
|
||||
--- a/libselinux/include/selinux/selinux.h
|
||||
+++ b/libselinux/include/selinux/selinux.h
|
||||
@@ -279,7 +279,7 @@ extern int security_validatetrans_raw(const char *scon,
|
||||
const char *newcon);
|
||||
|
||||
/* Load a policy configuration. */
|
||||
-extern int security_load_policy(void *data, size_t len);
|
||||
+extern int security_load_policy(const void *data, size_t len);
|
||||
|
||||
/* Get the context of an initial kernel security identifier by name.
|
||||
Caller must free via freecon */
|
||||
diff --git a/libselinux/man/man3/security_load_policy.3 b/libselinux/man/man3/security_load_policy.3
|
||||
index af5616363692..b2da02560799 100644
|
||||
--- a/libselinux/man/man3/security_load_policy.3
|
||||
+++ b/libselinux/man/man3/security_load_policy.3
|
||||
@@ -5,7 +5,7 @@ security_load_policy \- load a new SELinux policy
|
||||
.SH "SYNOPSIS"
|
||||
.B #include <selinux/selinux.h>
|
||||
.sp
|
||||
-.BI "int security_load_policy(void *" data ", size_t "len );
|
||||
+.BI "int security_load_policy(const void *" data ", size_t "len );
|
||||
.sp
|
||||
.BI "int selinux_mkload_policy(int " preservebools ");"
|
||||
.sp
|
||||
diff --git a/libselinux/src/load_policy.c b/libselinux/src/load_policy.c
|
||||
index d8c715edb0b6..17918e8be2b0 100644
|
||||
--- a/libselinux/src/load_policy.c
|
||||
+++ b/libselinux/src/load_policy.c
|
||||
@@ -23,7 +23,7 @@
|
||||
#define MNT_DETACH 2
|
||||
#endif
|
||||
|
||||
-int security_load_policy(void *data, size_t len)
|
||||
+int security_load_policy(const void *data, size_t len)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
int fd, ret;
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,37 +0,0 @@
|
||||
From 956bda08f6183078f13b70f6aa27d0529a3ec20a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Tue, 7 Jun 2022 19:00:35 +0200
|
||||
Subject: [PATCH] libselinux: restorecon: avoid printing NULL pointer
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
The variable `curcon` is NULL in case the file has no current security
|
||||
context. Most C standard libraries handle it fine, avoid it nonetheless
|
||||
for standard conformance.
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: Nicolas Iooss <nicolas.iooss@m4x.org>
|
||||
---
|
||||
libselinux/src/selinux_restorecon.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libselinux/src/selinux_restorecon.c b/libselinux/src/selinux_restorecon.c
|
||||
index 66e6a4a239d1..2d24559f2ea5 100644
|
||||
--- a/libselinux/src/selinux_restorecon.c
|
||||
+++ b/libselinux/src/selinux_restorecon.c
|
||||
@@ -744,7 +744,9 @@ static int restorecon_sb(const char *pathname, const struct stat *sb,
|
||||
selinux_log(SELINUX_INFO,
|
||||
"%s %s from %s to %s\n",
|
||||
updated ? "Relabeled" : "Would relabel",
|
||||
- pathname, curcon, newcon);
|
||||
+ pathname,
|
||||
+ curcon ? curcon : "<no context>",
|
||||
+ newcon);
|
||||
|
||||
if (flags->syslog_changes && !flags->nochange) {
|
||||
if (curcon)
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,60 +0,0 @@
|
||||
From ba9820a0020d06c7a37b34e771020cef8e9651a2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Wed, 6 Jul 2022 13:38:04 +0200
|
||||
Subject: [PATCH] libselinux: set errno to EBADF on O_PATH emulation ENOENT
|
||||
failure
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
When the O_PATH emulation fails due to getxattr(2)/setxattr(2) failing
|
||||
with ENOENT, e.g. because no procfs being available, override the errno
|
||||
value to EBADF. This avoids confusion to the caller as it would suggest
|
||||
the target of the operation does not exist, which is not the case:
|
||||
|
||||
setfiles: Could not set context for /: No such file or directory
|
||||
|
||||
Fixes: a782abf2 ("libselinux: emulate O_PATH support in fgetfilecon/fsetfilecon")
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/src/fgetfilecon.c | 5 ++++-
|
||||
libselinux/src/fsetfilecon.c | 5 ++++-
|
||||
2 files changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libselinux/src/fgetfilecon.c b/libselinux/src/fgetfilecon.c
|
||||
index baf38ec1221f..d7051171cf0d 100644
|
||||
--- a/libselinux/src/fgetfilecon.c
|
||||
+++ b/libselinux/src/fgetfilecon.c
|
||||
@@ -26,7 +26,10 @@ static ssize_t fgetxattr_wrapper(int fd, const char *name, void *value, size_t s
|
||||
|
||||
snprintf(buf, sizeof(buf), "/proc/self/fd/%d", fd);
|
||||
errno = saved_errno;
|
||||
- return getxattr(buf, name, value, size);
|
||||
+ ret = getxattr(buf, name, value, size);
|
||||
+ if (ret < 0 && errno == ENOENT)
|
||||
+ errno = EBADF;
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
int fgetfilecon_raw(int fd, char ** context)
|
||||
diff --git a/libselinux/src/fsetfilecon.c b/libselinux/src/fsetfilecon.c
|
||||
index be821c7a6be2..19ea15b711cc 100644
|
||||
--- a/libselinux/src/fsetfilecon.c
|
||||
+++ b/libselinux/src/fsetfilecon.c
|
||||
@@ -25,7 +25,10 @@ static int fsetxattr_wrapper(int fd, const char* name, const void* value, size_t
|
||||
|
||||
snprintf(buf, sizeof(buf), "/proc/self/fd/%d", fd);
|
||||
errno = saved_errno;
|
||||
- return setxattr(buf, name, value, size, flags);
|
||||
+ rc = setxattr(buf, name, value, size, flags);
|
||||
+ if (rc < 0 && errno == ENOENT)
|
||||
+ errno = EBADF;
|
||||
+ return rc;
|
||||
}
|
||||
|
||||
int fsetfilecon_raw(int fd, const char * context)
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,63 +0,0 @@
|
||||
From 142372522c7e12752387cc8d6621ee5823dd4a42 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Mon, 8 Aug 2022 19:34:29 +0200
|
||||
Subject: [PATCH] libselinux: avoid newline in avc message
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
Do not add a final newline to the avc log message as it will be treated
|
||||
as a part of the tclass field in final audit record:
|
||||
|
||||
{
|
||||
"AUDIT_FIELD_EXE" : "/usr/bin/dbus-broker",
|
||||
"_UID" : "104",
|
||||
"_AUDIT_SESSION" : "4294967295",
|
||||
"_TRANSPORT" : "audit",
|
||||
"__REALTIME_TIMESTAMP" : "1659975331468531",
|
||||
"_AUDIT_TYPE" : "1107",
|
||||
"AUDIT_FIELD_SCONTEXT" : "system_u:system_r:systemd_t:s0",
|
||||
"_AUDIT_LOGINUID" : "4294967295",
|
||||
"_SELINUX_CONTEXT" : "system_u:system_r:system_dbusd_t:s0-s0:c0.c1023",
|
||||
"AUDIT_FIELD_SAUID" : "104",
|
||||
"MESSAGE" : "USER_AVC pid=1538 uid=104 auid=4294967295 ses=4294967295 subj=system_u:system_r:system_dbusd_t:s0-s0:c0.c1023 msg='avc: granted { send_msg } for scontext=system_u:system_r:systemd_t:s0 tcontext=system_u:system_r:systemd_logind_t:s0 tclass=dbus\n exe=\"/usr/bin/dbus-broker\" sauid=104 hostname=? addr=? terminal=?'",
|
||||
"AUDIT_FIELD_TCONTEXT" : "system_u:system_r:systemd_logind_t:s0",
|
||||
"_SOURCE_REALTIME_TIMESTAMP" : "1659975331462000",
|
||||
"__MONOTONIC_TIMESTAMP" : "207995768",
|
||||
"AUDIT_FIELD_TCLASS" : "dbus\n",
|
||||
"AUDIT_FIELD_TERMINAL" : "?",
|
||||
"_PID" : "1538",
|
||||
"SYSLOG_FACILITY" : "4",
|
||||
"_BOOT_ID" : "3921464b65f64fb4a7c037dee97cd6ad",
|
||||
"SYSLOG_IDENTIFIER" : "audit",
|
||||
"_MACHINE_ID" : "5d78c28f10d54c0fb7b6fd1acc6af8ff",
|
||||
"_AUDIT_TYPE_NAME" : "USER_AVC",
|
||||
"__CURSOR" : "s=84589ce96ff8400189fc515ff892674a;i=c38e;b=3921464b65f64fb4a7c037dee97cd6ad;m=c65c378;t=5e5bd1ff7d4f3;x=c22e610fc9b00b10",
|
||||
"AUDIT_FIELD_ADDR" : "?",
|
||||
"AUDIT_FIELD_HOSTNAME" : "?",
|
||||
"_AUDIT_ID" : "1075",
|
||||
"_HOSTNAME" : "debianBullseye"
|
||||
}
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/src/avc.c | 1 -
|
||||
1 file changed, 1 deletion(-)
|
||||
|
||||
diff --git a/libselinux/src/avc.c b/libselinux/src/avc.c
|
||||
index 7493e4b24df2..8d5983a2fe0c 100644
|
||||
--- a/libselinux/src/avc.c
|
||||
+++ b/libselinux/src/avc.c
|
||||
@@ -725,7 +725,6 @@ void avc_audit(security_id_t ssid, security_id_t tsid,
|
||||
if (denied)
|
||||
log_append(avc_audit_buf, " permissive=%u", result ? 0 : 1);
|
||||
|
||||
- log_append(avc_audit_buf, "\n");
|
||||
avc_log(SELINUX_AVC, "%s", avc_audit_buf);
|
||||
|
||||
avc_release_lock(avc_log_lock);
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,56 +0,0 @@
|
||||
From c2d58b378b3cf350d042a7b657e2b7f5861c5f26 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Mon, 8 Aug 2022 19:36:55 +0200
|
||||
Subject: [PATCH] Ignore egg-info directories and clean them
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
Test .gitignore and make clean distclean
|
||||
error: missing .gitignore entry for libselinux/src/selinux.egg-info/
|
||||
error: missing .gitignore entry for python/sepolicy/sepolicy.egg-info/
|
||||
Error: Process completed with exit code 1.
|
||||
|
||||
error: "make clean distclean" did not remove libselinux/src/selinux.egg-info/PKG-INFO
|
||||
error: "make clean distclean" did not remove libselinux/src/selinux.egg-info/SOURCES.txt
|
||||
error: "make clean distclean" did not remove libselinux/src/selinux.egg-info/dependency_links.txt
|
||||
error: "make clean distclean" did not remove libselinux/src/selinux.egg-info/top_level.txt
|
||||
error: "make clean distclean" did not remove python/sepolicy/sepolicy.egg-info/PKG-INFO
|
||||
error: "make clean distclean" did not remove python/sepolicy/sepolicy.egg-info/SOURCES.txt
|
||||
error: "make clean distclean" did not remove python/sepolicy/sepolicy.egg-info/dependency_links.txt
|
||||
error: "make clean distclean" did not remove python/sepolicy/sepolicy.egg-info/top_level.txt
|
||||
Error: Process completed with exit code 1.
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/src/.gitignore | 1 +
|
||||
libselinux/src/Makefile | 2 +-
|
||||
2 files changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libselinux/src/.gitignore b/libselinux/src/.gitignore
|
||||
index 001f20b01e39..94400e81fb33 100644
|
||||
--- a/libselinux/src/.gitignore
|
||||
+++ b/libselinux/src/.gitignore
|
||||
@@ -1,3 +1,4 @@
|
||||
selinux.py
|
||||
selinuxswig_python_wrap.c
|
||||
selinuxswig_ruby_wrap.c
|
||||
+selinux.egg-info/
|
||||
diff --git a/libselinux/src/Makefile b/libselinux/src/Makefile
|
||||
index 88aa32f80944..49b7d60a1f74 100644
|
||||
--- a/libselinux/src/Makefile
|
||||
+++ b/libselinux/src/Makefile
|
||||
@@ -201,7 +201,7 @@ relabel:
|
||||
clean-pywrap:
|
||||
-rm -f $(SWIGLOBJ) $(SWIGSO) $(AUDIT2WHYLOBJ) $(AUDIT2WHYSO)
|
||||
$(PYTHON) setup.py clean
|
||||
- -rm -rf build *~ \#* *pyc .#*
|
||||
+ -rm -rf build *~ \#* *pyc .#* selinux.egg-info/
|
||||
|
||||
clean-rubywrap:
|
||||
-rm -f $(SWIGRUBYLOBJ) $(SWIGRUBYSO)
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,50 +0,0 @@
|
||||
From fa5b0504d861f569c6c97ab32719cc4a8dca0cd4 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
||||
Date: Tue, 30 Aug 2022 19:54:55 +0200
|
||||
Subject: [PATCH] libselinux: support objname in compute_create
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
Support passing an optional object name to compute_create for name
|
||||
based type transitions.
|
||||
|
||||
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/utils/compute_create.c | 9 ++++++---
|
||||
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/libselinux/utils/compute_create.c b/libselinux/utils/compute_create.c
|
||||
index c6481f4b01c1..5401fe967a53 100644
|
||||
--- a/libselinux/utils/compute_create.c
|
||||
+++ b/libselinux/utils/compute_create.c
|
||||
@@ -10,10 +10,11 @@ int main(int argc, char **argv)
|
||||
{
|
||||
char *buf;
|
||||
security_class_t tclass;
|
||||
+ const char *objname;
|
||||
int ret;
|
||||
|
||||
- if (argc != 4) {
|
||||
- fprintf(stderr, "usage: %s scontext tcontext tclass\n",
|
||||
+ if (argc != 4 && argc != 5) {
|
||||
+ fprintf(stderr, "usage: %s scontext tcontext tclass [objname]\n",
|
||||
argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
@@ -34,7 +35,9 @@ int main(int argc, char **argv)
|
||||
exit(2);
|
||||
}
|
||||
|
||||
- ret = security_compute_create(argv[1], argv[2], tclass, &buf);
|
||||
+ objname = (argc == 5) ? argv[4] : NULL;
|
||||
+
|
||||
+ ret = security_compute_create_name(argv[1], argv[2], tclass, objname, &buf);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "%s: security_compute_create failed: %s\n",
|
||||
argv[0], strerror(errno));
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,44 +0,0 @@
|
||||
From 94364696c5aed35a9c1f529d96d1930cef37ecda Mon Sep 17 00:00:00 2001
|
||||
From: James Carter <jwcart2@gmail.com>
|
||||
Date: Fri, 28 Oct 2022 16:10:39 -0400
|
||||
Subject: [PATCH] libselinux: Remove dependency on the Python module distutils
|
||||
Content-type: text/plain
|
||||
|
||||
The distutils package is deprecated and scheduled to be removed in
|
||||
Python 3.12. Use the setuptools and sysconfig modules instead.
|
||||
|
||||
Signed-off-by: James Carter <jwcart2@gmail.com>
|
||||
Acked-by: Petr Lautrbach <plautrba@redhat.com>
|
||||
---
|
||||
libselinux/src/Makefile | 2 +-
|
||||
libselinux/src/setup.py | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libselinux/src/Makefile b/libselinux/src/Makefile
|
||||
index 49b7d60a1f74..dc2848322e4d 100644
|
||||
--- a/libselinux/src/Makefile
|
||||
+++ b/libselinux/src/Makefile
|
||||
@@ -14,7 +14,7 @@ SHLIBDIR ?= /lib
|
||||
INCLUDEDIR ?= $(PREFIX)/include
|
||||
PYINC ?= $(shell $(PKG_CONFIG) --cflags $(PYPREFIX))
|
||||
PYLIBS ?= $(shell $(PKG_CONFIG) --libs $(PYPREFIX))
|
||||
-PYTHONLIBDIR ?= $(shell $(PYTHON) -c "from distutils.sysconfig import *; print(get_python_lib(plat_specific=1, prefix='$(PREFIX)'))")
|
||||
+PYTHONLIBDIR ?= $(shell $(PYTHON) -c "import sysconfig; print(sysconfig.get_path('platlib', vars={'platbase': '$(PREFIX)', 'base': '$(PREFIX)'}))")
|
||||
PYCEXT ?= $(shell $(PYTHON) -c 'import importlib.machinery;print(importlib.machinery.EXTENSION_SUFFIXES[0])')
|
||||
RUBYINC ?= $(shell $(RUBY) -e 'puts "-I" + RbConfig::CONFIG["rubyarchhdrdir"] + " -I" + RbConfig::CONFIG["rubyhdrdir"]')
|
||||
RUBYLIBS ?= $(shell $(RUBY) -e 'puts "-L" + RbConfig::CONFIG["libdir"] + " -L" + RbConfig::CONFIG["archlibdir"] + " " + RbConfig::CONFIG["LIBRUBYARG_SHARED"]')
|
||||
diff --git a/libselinux/src/setup.py b/libselinux/src/setup.py
|
||||
index 71e69a107f01..6cbe3a0e924b 100644
|
||||
--- a/libselinux/src/setup.py
|
||||
+++ b/libselinux/src/setup.py
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/python3
|
||||
|
||||
-from distutils.core import Extension, setup
|
||||
+from setuptools import Extension, setup
|
||||
|
||||
setup(
|
||||
name="selinux",
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,48 +0,0 @@
|
||||
From 2f71384f233aa544cf0cf50be7e83c7762ad1c15 Mon Sep 17 00:00:00 2001
|
||||
From: Vit Mojzis <vmojzis@redhat.com>
|
||||
Date: Mon, 31 Oct 2022 17:46:17 +0100
|
||||
Subject: [PATCH] libselinux: Ignore missing directories when -i is used
|
||||
Content-type: text/plain
|
||||
|
||||
Currently "-i" only ignores a file whose parent directory exists. Start also
|
||||
ignoring paths with missing components.
|
||||
|
||||
Fixes:
|
||||
# restorecon -i -v -R /var/log/missingdir/missingfile; echo $?
|
||||
255
|
||||
restorecon: SELinux: Could not get canonical path for /var/log/missingdir/missingfile restorecon: No such file or directory.
|
||||
|
||||
Signed-off-by: Vit Mojzis <vmojzis@redhat.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/src/selinux_restorecon.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/libselinux/src/selinux_restorecon.c b/libselinux/src/selinux_restorecon.c
|
||||
index 2d24559f2ea5..6b5f6921b82b 100644
|
||||
--- a/libselinux/src/selinux_restorecon.c
|
||||
+++ b/libselinux/src/selinux_restorecon.c
|
||||
@@ -1108,6 +1108,10 @@ static int selinux_restorecon_common(const char *pathname_orig,
|
||||
pathname = realpath(pathname_orig, NULL);
|
||||
if (!pathname) {
|
||||
free(basename_cpy);
|
||||
+ /* missing parent directory */
|
||||
+ if (state.flags.ignore_noent && errno == ENOENT) {
|
||||
+ return 0;
|
||||
+ }
|
||||
goto realpatherr;
|
||||
}
|
||||
} else {
|
||||
@@ -1121,6 +1125,9 @@ static int selinux_restorecon_common(const char *pathname_orig,
|
||||
free(dirname_cpy);
|
||||
if (!pathdnamer) {
|
||||
free(basename_cpy);
|
||||
+ if (state.flags.ignore_noent && errno == ENOENT) {
|
||||
+ return 0;
|
||||
+ }
|
||||
goto realpatherr;
|
||||
}
|
||||
if (!strcmp(pathdnamer, "/"))
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,44 +0,0 @@
|
||||
From f56a72ac9e86ddfbefedc41080f33fb06639f96b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Thi=C3=A9baud=20Weksteen?= <tweek@google.com>
|
||||
Date: Mon, 24 Oct 2022 20:13:54 +1100
|
||||
Subject: [PATCH] libselinux: ignore invalid class name lookup
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
Content-type: text/plain
|
||||
|
||||
selinux_check_access relies on string_to_security_class to resolve the
|
||||
class index from its char* argument. There is no input validation done
|
||||
on the string provided. It is possible to supply an argument containing
|
||||
trailing backslashes (i.e., "sock_file//////") so that the paths built
|
||||
in discover_class get truncated. The processing will then reference the
|
||||
same permission file multiple time (e.g., perms/watch_reads will be
|
||||
truncated to perms/watch). This will leak the memory allocated when
|
||||
strdup'ing the permission name. The discover_class_cache will end up in
|
||||
an invalid state (but not corrupted).
|
||||
|
||||
Ensure that the class provided does not contain any path separator.
|
||||
|
||||
Signed-off-by: Thiébaud Weksteen <tweek@google.com>
|
||||
Acked-by: James Carter <jwcart2@gmail.com>
|
||||
---
|
||||
libselinux/src/stringrep.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/libselinux/src/stringrep.c b/libselinux/src/stringrep.c
|
||||
index 2fe69f4391ae..592410e55da0 100644
|
||||
--- a/libselinux/src/stringrep.c
|
||||
+++ b/libselinux/src/stringrep.c
|
||||
@@ -63,6 +63,9 @@ static struct discover_class_node * discover_class(const char *s)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+ if (strchr(s, '/') != NULL)
|
||||
+ return NULL;
|
||||
+
|
||||
/* allocate a node */
|
||||
node = malloc(sizeof(struct discover_class_node));
|
||||
if (node == NULL)
|
||||
--
|
||||
2.38.1
|
||||
|
@ -1,45 +1,26 @@
|
||||
%define ruby_inc %(pkg-config --cflags ruby)
|
||||
%define libsepolver 3.4-4
|
||||
%define libsepolver 3.5-0
|
||||
|
||||
Summary: SELinux library and simple utilities
|
||||
Name: libselinux
|
||||
Version: 3.4
|
||||
Release: 6%{?dist}
|
||||
Version: 3.5
|
||||
Release: 0.rc1.1%{?dist}
|
||||
License: LicenseRef-Fedora-Public-Domain
|
||||
# https://github.com/SELinuxProject/selinux/wiki/Releases
|
||||
Source0: https://github.com/SELinuxProject/selinux/releases/download/3.4/libselinux-3.4.tar.gz
|
||||
Source0: https://github.com/SELinuxProject/selinux/releases/download/3.5-rc1/libselinux-3.5-rc1.tar.gz
|
||||
Source1: selinuxconlist.8
|
||||
Source2: selinuxdefcon.8
|
||||
Url: https://github.com/SELinuxProject/selinux/wiki
|
||||
# $ git clone https://github.com/fedora-selinux/selinux.git
|
||||
# $ cd selinux
|
||||
# $ git format-patch -N 3.4 -- libselinux
|
||||
# $ git format-patch -N 3.5-rc1 -- libselinux
|
||||
# $ i=1; for j in 00*patch; do printf "Patch%04d: %s\n" $i $j; i=$((i+1));done
|
||||
# Patch list start
|
||||
Patch0001: 0001-libselinux-declare-return-value-of-context_str-3-con.patch
|
||||
Patch0002: 0002-Revert-libselinux-restorecon-pin-file-to-avoid-TOCTO.patch
|
||||
Patch0003: 0003-libselinux-do-not-return-the-cached-prev_current-val.patch
|
||||
Patch0004: 0004-libselinux-simplify-policy-path-logic-to-avoid-unini.patch
|
||||
Patch0005: 0005-libselinux-add-header-guard-for-internal-header.patch
|
||||
Patch0006: 0006-libselinux-introduce-strlcpy.patch
|
||||
Patch0007: 0007-libselinux-check-for-truncations.patch
|
||||
Patch0008: 0008-libselinux-add-man-page-redirections.patch
|
||||
Patch0009: 0009-libselinux-enclose-macro-definition-in-parenthesis.patch
|
||||
Patch0010: 0010-libselinux-name-parameters-in-context.h.patch
|
||||
Patch0011: 0011-libselinux-declare-parameter-of-security_load_policy.patch
|
||||
Patch0012: 0012-libselinux-restorecon-avoid-printing-NULL-pointer.patch
|
||||
Patch0013: 0013-libselinux-set-errno-to-EBADF-on-O_PATH-emulation-EN.patch
|
||||
Patch0014: 0014-libselinux-avoid-newline-in-avc-message.patch
|
||||
Patch0015: 0015-Ignore-egg-info-directories-and-clean-them.patch
|
||||
Patch0016: 0016-libselinux-support-objname-in-compute_create.patch
|
||||
Patch0017: 0017-libselinux-Remove-dependency-on-the-Python-module-di.patch
|
||||
Patch0018: 0018-libselinux-Ignore-missing-directories-when-i-is-used.patch
|
||||
Patch0019: 0019-libselinux-ignore-invalid-class-name-lookup.patch
|
||||
Patch0020: 0020-Use-SHA-2-instead-of-SHA-1.patch
|
||||
Patch0001: 0001-Use-SHA-2-instead-of-SHA-1.patch
|
||||
# Patch list end
|
||||
BuildRequires: gcc make
|
||||
BuildRequires: ruby-devel ruby libsepol-static >= %{libsepolver} swig pcre2-devel xz-devel
|
||||
BuildRequires: python3 python3-devel python3-setuptools
|
||||
BuildRequires: python3 python3-devel python3-setuptools python3-pip
|
||||
BuildRequires: systemd
|
||||
Requires: libsepol%{?_isa} >= %{libsepolver} pcre2
|
||||
Conflicts: filesystem < 3, selinux-policy-base < 3.13.1-138
|
||||
@ -106,7 +87,7 @@ The libselinux-static package contains the static libraries
|
||||
needed for developing SELinux applications.
|
||||
|
||||
%prep
|
||||
%autosetup -p 2 -n libselinux-%{version}
|
||||
%autosetup -p 2 -n libselinux-%{version}-rc1
|
||||
|
||||
%build
|
||||
export DISABLE_RPM="y"
|
||||
@ -232,6 +213,9 @@ rm -f %{buildroot}%{_mandir}/man8/togglesebool*
|
||||
%{ruby_vendorarchdir}/selinux.so
|
||||
|
||||
%changelog
|
||||
* Fri Dec 23 2022 Petr Lautrbach <lautrbach@redhat.com> - 3.5-0.rc1.1
|
||||
- SELinux userspace 3.5-rc1 release
|
||||
|
||||
* Mon Nov 21 2022 Petr Lautrbach <lautrbach@redhat.com> - 3.4-6
|
||||
- Rebase on upstream f56a72ac9e86
|
||||
|
||||
|
2
sources
2
sources
@ -1 +1 @@
|
||||
SHA512 (libselinux-3.4.tar.gz) = 7ffa6d2159d2333d836bde3f75dfc78a278283b66ae1e441c178371adb6f463aa6f2d62439079e2068d1135c39dd2b367b001d917c0bdc6871a73630919ef81e
|
||||
SHA512 (libselinux-3.5-rc1.tar.gz) = c4022a39d583a883944d6a6045605dd734448a36811a589248d0bf48e6ca1b0607c4480744778d7b9ae7cac916455a33d10f32b73c78a122ffc6090b8f7f6e12
|
||||
|
Loading…
Reference in New Issue
Block a user