Skip to content

Commit

Permalink
pythongh-48511: Make pwd and grp expose inner errors
Browse files Browse the repository at this point in the history
Distinguish
between the case when the user/group does not exist and error
conditions.
If the user does not exit, raise KeyError as  now, for errors raise OSError.
  • Loading branch information
simaoafonso-pwt committed Feb 24, 2023
1 parent 81bf10e commit a27c3ae
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 32 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
The Unix user (:func:`pwd.getpwuid`, :func:`pwd.getpwnam`) and group (
:func:`grp.getgrgid`, :func:`grp.getgrnam`) database functions now
differentiate between a lack of record (:exc:`KeyError` is risen, the current behaviour)
and a database access error (:exc:`OSError` is risen).

Based on a patch by Oleg Iarygin.
39 changes: 24 additions & 15 deletions Modules/grpmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,21 +158,25 @@ grp_getgrgid_impl(PyObject *module, PyObject *id)
p = getgrgid(gid);
#endif
if (p == NULL) {
PyMem_RawFree(buf);
if (nomem == 1) {
return PyErr_NoMemory();
retval = PyErr_NoMemory();
}
else if (errno == 0) {
PyObject *gid_obj = _PyLong_FromGid(gid);
if (gid_obj == NULL)
return NULL;
retval = PyErr_Format(PyExc_KeyError,
"getgrgid(): gid not found: %S", gid_obj);
Py_DECREF(gid_obj);
}
else {
retval = PyErr_SetFromErrno(PyExc_OSError);
}
PyObject *gid_obj = _PyLong_FromGid(gid);
if (gid_obj == NULL)
return NULL;
PyErr_Format(PyExc_KeyError, "getgrgid(): gid not found: %S", gid_obj);
Py_DECREF(gid_obj);
return NULL;
}
retval = mkgrent(module, p);
#ifdef HAVE_GETGRGID_R
else {
retval = mkgrent(module, p);
}
PyMem_RawFree(buf);
#endif
return retval;
}

Expand Down Expand Up @@ -240,14 +244,19 @@ grp_getgrnam_impl(PyObject *module, PyObject *name)
#endif
if (p == NULL) {
if (nomem == 1) {
PyErr_NoMemory();
retval = PyErr_NoMemory();
}
else if (errno == 0) {
retval = PyErr_Format(PyExc_KeyError,
"getgrnam(): name not found: %R", name);
}
else {
PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %R", name);
retval = PyErr_SetFromErrno(PyExc_OSError);
}
goto out;
}
retval = mkgrent(module, p);
else {
retval = mkgrent(module, p);
}
out:
PyMem_RawFree(buf);
Py_DECREF(bytes);
Expand Down
41 changes: 24 additions & 17 deletions Modules/pwdmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -178,22 +178,25 @@ pwd_getpwuid(PyObject *module, PyObject *uidobj)
p = getpwuid(uid);
#endif
if (p == NULL) {
PyMem_RawFree(buf);
if (nomem == 1) {
return PyErr_NoMemory();
retval = PyErr_NoMemory();
}
else if (errno == 0) {
PyObject *uid_obj = _PyLong_FromUid(uid);
if (uid_obj == NULL)
return NULL;
retval = PyErr_Format(PyExc_KeyError,
"getpwuid(): uid not found: %S", uid_obj);
Py_DECREF(uid_obj);
}
else {
retval = PyErr_SetFromErrno(PyExc_OSError);
}
PyObject *uid_obj = _PyLong_FromUid(uid);
if (uid_obj == NULL)
return NULL;
PyErr_Format(PyExc_KeyError,
"getpwuid(): uid not found: %S", uid_obj);
Py_DECREF(uid_obj);
return NULL;
}
retval = mkpwent(module, p);
#ifdef HAVE_GETPWUID_R
else {
retval = mkpwent(module, p);
}
PyMem_RawFree(buf);
#endif
return retval;
}

Expand Down Expand Up @@ -262,15 +265,19 @@ pwd_getpwnam_impl(PyObject *module, PyObject *name)
#endif
if (p == NULL) {
if (nomem == 1) {
PyErr_NoMemory();
retval = PyErr_NoMemory();
}
else if (errno == 0) {
retval = PyErr_Format(PyExc_KeyError,
"getpwnam(): name not found: %R", name);
}
else {
PyErr_Format(PyExc_KeyError,
"getpwnam(): name not found: %R", name);
retval = PyErr_SetFromErrno(PyExc_OSError);
}
goto out;
}
retval = mkpwent(module, p);
else {
retval = mkpwent(module, p);
}
out:
PyMem_RawFree(buf);
Py_DECREF(bytes);
Expand Down

0 comments on commit a27c3ae

Please sign in to comment.