]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
lib/, src/: add SELinux control flag in sub_uid_close()
authorIker Pedrosa <ipedrosa@redhat.com>
Fri, 25 Apr 2025 13:35:48 +0000 (15:35 +0200)
committerIker Pedrosa <ipedrosa@redhat.com>
Tue, 7 Oct 2025 09:04:39 +0000 (11:04 +0200)
Expand sub_uid_close() interface to add a control flag for SELinux file
context processing.

Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com>
lib/subordinateio.c
lib/subordinateio.h
lib/user_busy.c
src/newuidmap.c
src/newusers.c
src/useradd.c
src/userdel.c
src/usermod.c

index 1a9bbbfa271f6548e2e33416a83401c79107027d..dd0a95899324f53d1887d7fa55922502fd41dc06 100644 (file)
@@ -591,7 +591,7 @@ static bool have_range(struct commonio_db *db,
 
        if (doclose) {
                if (db == &subordinate_uid_db)
-                       sub_uid_close();
+                       sub_uid_close(true);
                else
                        sub_gid_close();
        }
@@ -669,9 +669,9 @@ int sub_uid_remove (const char *owner, uid_t start, unsigned long count)
        return remove_range (&subordinate_uid_db, owner, start, count);
 }
 
-int sub_uid_close (void)
+int sub_uid_close (bool process_selinux)
 {
-       return commonio_close (&subordinate_uid_db, true);
+       return commonio_close (&subordinate_uid_db, process_selinux);
 }
 
 int sub_uid_unlock (void)
@@ -931,7 +931,7 @@ int list_owner_ranges(const char *owner, enum subid_type id_type, struct subid_r
 
 out:
        if (id_type == ID_TYPE_UID)
-               sub_uid_close();
+               sub_uid_close(true);
        else
                sub_gid_close();
 
@@ -1022,7 +1022,7 @@ int find_subid_owners(unsigned long id, enum subid_type id_type, uid_t **uids)
        }
 
        if (id_type == ID_TYPE_UID)
-               sub_uid_close();
+               sub_uid_close(true);
        else
                sub_gid_close();
 
@@ -1092,7 +1092,7 @@ bool new_subid_range(struct subordinate_range *range, enum subid_type id_type, b
 
 out:
        if (id_type == ID_TYPE_UID) {
-               sub_uid_close();
+               sub_uid_close(true);
                sub_uid_unlock();
        } else {
                sub_gid_close();
@@ -1142,7 +1142,7 @@ bool release_subid_range(struct subordinate_range *range, enum subid_type id_typ
        ret = remove_range(db, range->owner, range->start, range->count) == 1;
 
        if (id_type == ID_TYPE_UID) {
-               sub_uid_close();
+               sub_uid_close(true);
                sub_uid_unlock();
        } else {
                sub_gid_close();
index e0aa99d9f1883bb112bbeac2e85787a958e667bb..a2a49270db24d5879d5adf988ebd3984fa8998ed 100644 (file)
@@ -13,7 +13,7 @@
 
 #include "../libsubid/subid.h"
 
-extern int sub_uid_close(void);
+extern int sub_uid_close(bool process_selinux);
 extern bool have_sub_uids(const char *owner, uid_t start, unsigned long count);
 extern bool sub_uid_file_present (void);
 extern bool local_sub_uid_assigned(const char *owner);
index 630249399c2451713a7494793e66b0748725adbd..a05faef166723ef3aa7070d59ff6a789db64cec0 100644 (file)
@@ -180,7 +180,7 @@ static int user_busy_processes (const char *name, uid_t uid)
        if (proc == NULL) {
                perror ("opendir /proc");
 #ifdef ENABLE_SUBIDS
-               sub_uid_close();
+               sub_uid_close(true);
 #endif
                return 0;
        }
@@ -188,7 +188,7 @@ static int user_busy_processes (const char *name, uid_t uid)
                perror ("stat (\"/\")");
                (void) closedir (proc);
 #ifdef ENABLE_SUBIDS
-               sub_uid_close();
+               sub_uid_close(true);
 #endif
                return 0;
        }
@@ -225,7 +225,7 @@ static int user_busy_processes (const char *name, uid_t uid)
                if (check_status (name, tmp_d_name, uid) != 0) {
                        (void) closedir (proc);
 #ifdef ENABLE_SUBIDS
-                       sub_uid_close();
+                       sub_uid_close(true);
 #endif
                        fprintf (log_get_logfd(),
                                 _("%s: user %s is currently used by process %d\n"),
@@ -248,7 +248,7 @@ static int user_busy_processes (const char *name, uid_t uid)
                                        (void) closedir (proc);
                                        (void) closedir (task_dir);
 #ifdef ENABLE_SUBIDS
-                                       sub_uid_close();
+                                       sub_uid_close(true);
 #endif
                                        fprintf (log_get_logfd(),
                                                 _("%s: user %s is currently used by process %d\n"),
@@ -264,7 +264,7 @@ static int user_busy_processes (const char *name, uid_t uid)
 
        (void) closedir (proc);
 #ifdef ENABLE_SUBIDS
-       sub_uid_close();
+       sub_uid_close(true);
 #endif                         /* ENABLE_SUBIDS */
        return 0;
 }
index 474194c1138593f76f252c380e7e72b2825a34fa..d9c3b4bafcc17e6d1fb1e7210244d923ec12ca0c 100644 (file)
@@ -159,7 +159,7 @@ int main(int argc, char **argv)
 
        write_mapping(proc_dir_fd, ranges, mappings, "uid_map", pw->pw_uid);
        if (want_subuid_file())
-               sub_uid_close();
+               sub_uid_close(true);
 
        return EXIT_SUCCESS;
 }
index 2cbe74f6ad33e383045ef55f817a6721eb51815b..b1cb0967da8530ff9b874cd35f756894a10add0f 100644 (file)
@@ -978,7 +978,7 @@ static void close_files (void)
                fail_exit (EXIT_FAILURE);
        }
 #ifdef ENABLE_SUBIDS
-       if (is_sub_uid  && (sub_uid_close () == 0)) {
+       if (is_sub_uid  && (sub_uid_close (true) == 0)) {
                fprintf (stderr,
                         _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ());
                SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ()));
index 3cd7bd10f864dd0199d38077cf2ea262517758ae..50fc5f4331a55e27a52b8b4a500a475b05eb1b84 100644 (file)
@@ -1577,7 +1577,7 @@ static void close_files (void)
        close_group_files ();
 
 #ifdef ENABLE_SUBIDS
-       if (is_sub_uid  && (sub_uid_close () == 0)) {
+       if (is_sub_uid  && (sub_uid_close (true) == 0)) {
                fprintf (stderr,
                         _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ());
                SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ()));
index a9e2e3ac98612ed6144d84474439d246ccc27df2..8ef4117bfe5a40c8c6f6f6dfd3ffe840171f164f 100644 (file)
@@ -450,7 +450,7 @@ static void close_files (void)
 
 #ifdef ENABLE_SUBIDS
        if (is_sub_uid) {
-               if (sub_uid_close () == 0) {
+               if (sub_uid_close (true) == 0) {
                        fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ());
                        SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ()));
                        fail_exit (E_SUB_UID_UPDATE);
index 4e2d225555efe24191290315c6efe10c40fc0a2c..ece56a66d706e0011fd103422e1fc5db1a93aa96 100644 (file)
@@ -1564,7 +1564,7 @@ static void close_files (void)
 
 #ifdef ENABLE_SUBIDS
        if (vflg || Vflg) {
-               if (sub_uid_close () == 0) {
+               if (sub_uid_close (true) == 0) {
                        fprintf (stderr, _("%s: failure while writing changes to %s\n"), Prog, sub_uid_dbname ());
                        SYSLOG ((LOG_ERR, "failure while writing changes to %s", sub_uid_dbname ()));
                        fail_exit (E_SUB_UID_UPDATE);