74de835
From a63f93d83b57f1a10712c5fcd29be246e8eff20d Mon Sep 17 00:00:00 2001
74de835
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
74de835
Date: Tue, 25 Aug 2020 17:32:05 +0200
74de835
Subject: [PATCH] libselinux: initialize last_policyload in
74de835
 selinux_status_open()
74de835
MIME-Version: 1.0
74de835
Content-Type: text/plain; charset=UTF-8
74de835
Content-Transfer-Encoding: 8bit
74de835
74de835
If not initialized to the current policyload count, an enforcing change
74de835
will trigger policyload-callbacks in selinux_status_updated().
74de835
74de835
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
74de835
Acked-by: Stephen Smalley <stephen.smalley.work@gmail.com>
74de835
---
74de835
 libselinux/src/sestatus.c | 15 ++++++++++++---
74de835
 1 file changed, 12 insertions(+), 3 deletions(-)
74de835
74de835
diff --git a/libselinux/src/sestatus.c b/libselinux/src/sestatus.c
74de835
index ca2d3bbf9cb2..9ff2785d876a 100644
74de835
--- a/libselinux/src/sestatus.c
74de835
+++ b/libselinux/src/sestatus.c
74de835
@@ -278,9 +278,10 @@ static int fallback_cb_policyload(int policyload)
74de835
  */
74de835
 int selinux_status_open(int fallback)
74de835
 {
74de835
-	int	fd;
74de835
-	char	path[PATH_MAX];
74de835
-	long	pagesize;
74de835
+	int		fd;
74de835
+	char		path[PATH_MAX];
74de835
+	long		pagesize;
74de835
+	uint32_t	seqno;
74de835
 
74de835
 	if (!selinux_mnt) {
74de835
 		errno = ENOENT;
74de835
@@ -304,6 +305,14 @@ int selinux_status_open(int fallback)
74de835
 	selinux_status_fd = fd;
74de835
 	last_seqno = (uint32_t)(-1);
74de835
 
74de835
+	/* sequence must not be changed during references */
74de835
+	do {
74de835
+		seqno = read_sequence(selinux_status);
74de835
+
74de835
+		last_policyload = selinux_status->policyload;
74de835
+
74de835
+	} while (seqno != read_sequence(selinux_status));
74de835
+
74de835
 	/* No need to use avc threads if the kernel status page is available */
74de835
 	avc_using_threads = 0;
74de835
 
74de835
-- 
74de835
2.29.0
74de835