Fix grp.getgrnam raising OSError for unknown groups (#9101)

Some NSS modules (e.g. sss, systemd) return ENOENT from
getgrnam_r/getgrgid_r for a missing group. Treat any lookup error
as "not found" and raise KeyError, matching CPython. This fixes
test_shutil's test_chown and test_make_archive_owner_group.

Assisted-by: Antigravity:claude-opus-5-5
This commit is contained in:
Leesoo Ahn authored and GitHub committed 2026-10-14 09:36:18 +09:00
1 parent c0c6306233
commit e157f645a2
1 file changed
+10 -14
+10 -14
View File
@@ -6,7 +6,7 @@ mod grp {
use crate::vm::{
PyObjectRef, PyResult, VirtualMachine,
builtins::{PyListRef, PyUtf8StrRef},
convert::{IntoPyException, ToPyObject},
convert::ToPyObject,
exceptions,
function::ArgIndex,
types::PyStructSequence,
@@ -54,17 +54,14 @@ mod grp {
let gr_gid = gid.as_bigint();
let gid = host_grp::gid_t::try_from(gr_gid).ok();
let group = gid
.map(host_grp::getgrgid)
.transpose()
.map_err(|err| err.into_pyexception(vm))?
.flatten();
let group = group.ok_or_else(|| {
vm.new_key_error(
vm.ctx
.new_str(format!("getgrgid: group id {gr_gid} not found"))
.into(),
)
})?;
.and_then(|gid| host_grp::getgrgid(gid).ok().flatten())
.ok_or_else(|| {
vm.new_key_error(
vm.ctx
.new_str(format!("getgrgid: group id {gr_gid} not found"))
.into(),
)
})?;
Ok(GroupData::from_group(group, vm))
}
@@ -82,8 +79,7 @@ mod grp {
return Err(exceptions::nul_char_error(vm));
}
let gr_name = name.as_str();
let group = host_grp::getgrnam(gr_name).map_err(|err| err.into_pyexception(vm))?;
let group = group.ok_or_else(|| {
let group = host_grp::getgrnam(gr_name).ok().flatten().ok_or_else(|| {
vm.new_key_error(
vm.ctx
.new_str(format!("getgrnam: group name {gr_name} not found"))