This commit is contained in:
Simão Afonso @ Powertools Tech 2025-07-10 06:57:38 +03:00 committed by GitHub
commit 036aac60e6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 54 additions and 32 deletions

View file

@ -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.

View file

@ -171,21 +171,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;
}
@ -253,14 +257,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);

View file

@ -185,22 +185,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;
}
@ -269,15 +272,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);