Signed-off-by: Christian Göttsche <cgzones@xxxxxxxxxxxxxx> --- libselinux/src/sestatus.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/libselinux/src/sestatus.c b/libselinux/src/sestatus.c index 925e6079..62a864b1 100644 --- a/libselinux/src/sestatus.c +++ b/libselinux/src/sestatus.c @@ -99,7 +99,9 @@ static inline uint32_t read_sequence(struct selinux_status_t *status) int selinux_status_updated(void) { uint32_t curr_seqno; - int result = 0; + uint32_t tmp_seqno; + uint32_t enforcing; + uint32_t policyload; if (selinux_status == NULL) { errno = EINVAL; @@ -125,21 +127,28 @@ int selinux_status_updated(void) if (last_seqno & 0x0001) last_seqno = curr_seqno; - if (last_seqno != curr_seqno) - { - if (avc_enforcing != (int) selinux_status->enforcing) { - if (avc_process_setenforce(selinux_status->enforcing) < 0) - return -1; - } - if (last_policyload != selinux_status->policyload) { - if (avc_process_policyload(selinux_status->policyload) < 0) - return -1; - last_policyload = selinux_status->policyload; - } - last_seqno = curr_seqno; - result = 1; + if (last_seqno == curr_seqno) + return 0; + + do { + enforcing = selinux_status->enforcing; + policyload = selinux_status->policyload; + tmp_seqno = curr_seqno; + curr_seqno = read_sequence(selinux_status); + } while (tmp_seqno != curr_seqno); + + if (avc_enforcing != (int) enforcing) { + if (avc_process_setenforce(enforcing) < 0) + return -1; } - return result; + if (last_policyload != policyload) { + if (avc_process_policyload(policyload) < 0) + return -1; + last_policyload = policyload; + } + last_seqno = curr_seqno; + + return 1; } /* -- 2.28.0