Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.
49 changes: 28 additions & 21 deletions Modules/grpmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,24 +179,29 @@ grp_getgrgid_impl(PyObject *module, PyObject *id)
p = getgrgid(gid);
#endif
if (p == NULL) {
#ifndef HAVE_GETGRGID_R
PyMutex_Unlock(&group_db_mutex);
#endif
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) {
retval = NULL;
}
else {
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);
#else
#ifndef HAVE_GETGRGID_R
PyMutex_Unlock(&group_db_mutex);
#endif
return retval;
Expand Down Expand Up @@ -268,18 +273,20 @@ grp_getgrnam_impl(PyObject *module, PyObject *name)
p = getgrnam(name_chars);
#endif
if (p == NULL) {
#ifndef HAVE_GETGRNAM_R
PyMutex_Unlock(&group_db_mutex);
#endif
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);
}
#ifndef HAVE_GETGRNAM_R
PyMutex_Unlock(&group_db_mutex);
#endif
Expand Down
53 changes: 29 additions & 24 deletions Modules/pwdmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -187,27 +187,31 @@ pwd_getpwuid(PyObject *module, PyObject *uidobj)
p = getpwuid(uid);
#endif
if (p == NULL) {
#ifndef HAVE_GETPWUID_R
PyMutex_Unlock(&pwd_db_mutex);
#endif
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) {
retval = NULL;
}
else {
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
PyMem_RawFree(buf);
#else
else {
retval = mkpwent(module, p);
}
#ifndef HAVE_GETPWUID_R
PyMutex_Unlock(&pwd_db_mutex);
#endif
PyMem_RawFree(buf);
return retval;
}

Expand Down Expand Up @@ -278,19 +282,20 @@ pwd_getpwnam_impl(PyObject *module, PyObject *name)
p = getpwnam(name_chars);
#endif
if (p == NULL) {
#ifndef HAVE_GETPWNAM_R
PyMutex_Unlock(&pwd_db_mutex);
#endif
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);
}
#ifndef HAVE_GETPWNAM_R
PyMutex_Unlock(&pwd_db_mutex);
#endif
Expand Down
Loading