Commit 28658485 authored by William Grzybowski's avatar William Grzybowski Committed by Victor Stinner

bpo-34604: Fix possible mojibake in pwd.getpwnam() and grp.getgrnam() (GH-9098)

Pass the user/group name as Unicode to the formatting function,
instead of always decoding a bytes string from UTF-8.
parent 7e610bcd
Fix possible mojibake in the error message of `pwd.getpwnam` and
`grp.getgrnam`. Patch by William Grzybowski.
...@@ -14,7 +14,7 @@ PyDoc_STRVAR(pwd_getpwuid__doc__, ...@@ -14,7 +14,7 @@ PyDoc_STRVAR(pwd_getpwuid__doc__,
{"getpwuid", (PyCFunction)pwd_getpwuid, METH_O, pwd_getpwuid__doc__}, {"getpwuid", (PyCFunction)pwd_getpwuid, METH_O, pwd_getpwuid__doc__},
PyDoc_STRVAR(pwd_getpwnam__doc__, PyDoc_STRVAR(pwd_getpwnam__doc__,
"getpwnam($module, arg, /)\n" "getpwnam($module, name, /)\n"
"--\n" "--\n"
"\n" "\n"
"Return the password database entry for the given user name.\n" "Return the password database entry for the given user name.\n"
...@@ -25,18 +25,18 @@ PyDoc_STRVAR(pwd_getpwnam__doc__, ...@@ -25,18 +25,18 @@ PyDoc_STRVAR(pwd_getpwnam__doc__,
{"getpwnam", (PyCFunction)pwd_getpwnam, METH_O, pwd_getpwnam__doc__}, {"getpwnam", (PyCFunction)pwd_getpwnam, METH_O, pwd_getpwnam__doc__},
static PyObject * static PyObject *
pwd_getpwnam_impl(PyObject *module, PyObject *arg); pwd_getpwnam_impl(PyObject *module, PyObject *name);
static PyObject * static PyObject *
pwd_getpwnam(PyObject *module, PyObject *arg_) pwd_getpwnam(PyObject *module, PyObject *arg)
{ {
PyObject *return_value = NULL; PyObject *return_value = NULL;
PyObject *arg; PyObject *name;
if (!PyArg_Parse(arg_, "U:getpwnam", &arg)) { if (!PyArg_Parse(arg, "U:getpwnam", &name)) {
goto exit; goto exit;
} }
return_value = pwd_getpwnam_impl(module, arg); return_value = pwd_getpwnam_impl(module, name);
exit: exit:
return return_value; return return_value;
...@@ -69,4 +69,4 @@ pwd_getpwall(PyObject *module, PyObject *Py_UNUSED(ignored)) ...@@ -69,4 +69,4 @@ pwd_getpwall(PyObject *module, PyObject *Py_UNUSED(ignored))
#ifndef PWD_GETPWALL_METHODDEF #ifndef PWD_GETPWALL_METHODDEF
#define PWD_GETPWALL_METHODDEF #define PWD_GETPWALL_METHODDEF
#endif /* !defined(PWD_GETPWALL_METHODDEF) */ #endif /* !defined(PWD_GETPWALL_METHODDEF) */
/*[clinic end generated code: output=fc41d8d88ec206d8 input=a9049054013a1b77]*/ /*[clinic end generated code: output=3c93120d6dd86905 input=a9049054013a1b77]*/
...@@ -245,7 +245,7 @@ grp_getgrnam_impl(PyObject *module, PyObject *name) ...@@ -245,7 +245,7 @@ grp_getgrnam_impl(PyObject *module, PyObject *name)
PyErr_NoMemory(); PyErr_NoMemory();
} }
else { else {
PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %s", name_chars); PyErr_Format(PyExc_KeyError, "getgrnam(): name not found: %S", name);
} }
goto out; goto out;
} }
......
...@@ -189,7 +189,7 @@ pwd_getpwuid(PyObject *module, PyObject *uidobj) ...@@ -189,7 +189,7 @@ pwd_getpwuid(PyObject *module, PyObject *uidobj)
/*[clinic input] /*[clinic input]
pwd.getpwnam pwd.getpwnam
arg: unicode name: unicode
/ /
Return the password database entry for the given user name. Return the password database entry for the given user name.
...@@ -198,18 +198,18 @@ See `help(pwd)` for more on password database entries. ...@@ -198,18 +198,18 @@ See `help(pwd)` for more on password database entries.
[clinic start generated code]*/ [clinic start generated code]*/
static PyObject * static PyObject *
pwd_getpwnam_impl(PyObject *module, PyObject *arg) pwd_getpwnam_impl(PyObject *module, PyObject *name)
/*[clinic end generated code: output=6abeee92430e43d2 input=d5f7e700919b02d3]*/ /*[clinic end generated code: output=359ce1ddeb7a824f input=a6aeb5e3447fb9e0]*/
{ {
char *buf = NULL, *buf2 = NULL, *name; char *buf = NULL, *buf2 = NULL, *name_chars;
int nomem = 0; int nomem = 0;
struct passwd *p; struct passwd *p;
PyObject *bytes, *retval = NULL; PyObject *bytes, *retval = NULL;
if ((bytes = PyUnicode_EncodeFSDefault(arg)) == NULL) if ((bytes = PyUnicode_EncodeFSDefault(name)) == NULL)
return NULL; return NULL;
/* check for embedded null bytes */ /* check for embedded null bytes */
if (PyBytes_AsStringAndSize(bytes, &name, NULL) == -1) if (PyBytes_AsStringAndSize(bytes, &name_chars, NULL) == -1)
goto out; goto out;
#ifdef HAVE_GETPWNAM_R #ifdef HAVE_GETPWNAM_R
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
...@@ -229,7 +229,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *arg) ...@@ -229,7 +229,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *arg)
break; break;
} }
buf = buf2; buf = buf2;
status = getpwnam_r(name, &pwd, buf, bufsize, &p); status = getpwnam_r(name_chars, &pwd, buf, bufsize, &p);
if (status != 0) { if (status != 0) {
p = NULL; p = NULL;
} }
...@@ -245,7 +245,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *arg) ...@@ -245,7 +245,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *arg)
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
#else #else
p = getpwnam(name); p = getpwnam(name_chars);
#endif #endif
if (p == NULL) { if (p == NULL) {
if (nomem == 1) { if (nomem == 1) {
...@@ -253,7 +253,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *arg) ...@@ -253,7 +253,7 @@ pwd_getpwnam_impl(PyObject *module, PyObject *arg)
} }
else { else {
PyErr_Format(PyExc_KeyError, PyErr_Format(PyExc_KeyError,
"getpwnam(): name not found: %s", name); "getpwnam(): name not found: %S", name);
} }
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment