From f33bfb9321e5ebef0ef703aa6bfc8ee95bd21e1f Mon Sep 17 00:00:00 2001 From: Victor Prokhorov Date: Fri, 6 Mar 2026 08:09:17 +0100 Subject: [PATCH] chroot: resolve all ids before chroot --- src/uu/chroot/src/chroot.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/uu/chroot/src/chroot.rs b/src/uu/chroot/src/chroot.rs index bed981b38..23e696be9 100644 --- a/src/uu/chroot/src/chroot.rs +++ b/src/uu/chroot/src/chroot.rs @@ -390,17 +390,18 @@ fn set_supplemental_gids_with_strategy( /// Change the root, set the user ID, and set the group IDs for this process. fn set_context(options: &Options) -> UResult<()> { - enter_chroot(&options.newroot, options.skip_chdir)?; match &options.userspec { None | Some(UserSpec::NeitherGroupNorUser) => { let strategy = Strategy::Nothing; set_supplemental_gids_with_strategy(strategy, options.groups.as_ref())?; + enter_chroot(&options.newroot, options.skip_chdir)?; } Some(UserSpec::UserOnly(user)) => { let uid = name_to_uid(user)?; let gid = usr2gid(user).map_err(|_| ChrootError::NoGroupSpecified(uid))?; let strategy = Strategy::FromUID(uid, false); set_supplemental_gids_with_strategy(strategy, options.groups.as_ref())?; + enter_chroot(&options.newroot, options.skip_chdir)?; set_gid(gid).map_err(|e| ChrootError::SetGidFailed(user.to_owned(), e))?; set_uid(uid).map_err(|e| ChrootError::SetUserFailed(user.to_owned(), e))?; } @@ -408,6 +409,7 @@ fn set_context(options: &Options) -> UResult<()> { let gid = name_to_gid(group)?; let strategy = Strategy::Nothing; set_supplemental_gids_with_strategy(strategy, options.groups.as_ref())?; + enter_chroot(&options.newroot, options.skip_chdir)?; set_gid(gid).map_err(|e| ChrootError::SetGidFailed(group.to_owned(), e))?; } Some(UserSpec::UserAndGroup(user, group)) => { @@ -415,6 +417,7 @@ fn set_context(options: &Options) -> UResult<()> { let gid = name_to_gid(group)?; let strategy = Strategy::FromUID(uid, true); set_supplemental_gids_with_strategy(strategy, options.groups.as_ref())?; + enter_chroot(&options.newroot, options.skip_chdir)?; set_gid(gid).map_err(|e| ChrootError::SetGidFailed(group.to_owned(), e))?; set_uid(uid).map_err(|e| ChrootError::SetUserFailed(user.to_owned(), e))?; }