Commit 666bbf12 authored by Guido van Rossum's avatar Guido van Rossum

posix.confname(): enforce that names as str instances.

parent 7a6258f7
...@@ -5441,7 +5441,7 @@ struct constdef { ...@@ -5441,7 +5441,7 @@ struct constdef {
static int static int
conv_confname(PyObject *arg, int *valuep, struct constdef *table, conv_confname(PyObject *arg, int *valuep, struct constdef *table,
size_t tablesize) size_t tablesize)
{ {
if (PyInt_Check(arg)) { if (PyInt_Check(arg)) {
*valuep = PyInt_AS_LONG(arg); *valuep = PyInt_AS_LONG(arg);
...@@ -5450,16 +5450,20 @@ conv_confname(PyObject *arg, int *valuep, struct constdef *table, ...@@ -5450,16 +5450,20 @@ conv_confname(PyObject *arg, int *valuep, struct constdef *table,
else { else {
/* look up the value in the table using a binary search */ /* look up the value in the table using a binary search */
size_t lo = 0; size_t lo = 0;
size_t mid; size_t mid;
size_t hi = tablesize; size_t hi = tablesize;
int cmp; int cmp;
const char *confname; const char *confname;
Py_ssize_t namelen; Py_ssize_t namelen;
if (PyObject_AsCharBuffer(arg, &confname, &namelen) < 0) { if (!PyUnicode_Check(arg)) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"configuration names must be strings or integers"); "configuration names must be strings or integers");
return 0; return 0;
} }
confname = PyUnicode_AsString(arg);
if (confname == NULL)
return 0;
namelen = strlen(confname);
while (lo < hi) { while (lo < hi) {
mid = (lo + hi) / 2; mid = (lo + hi) / 2;
cmp = strcmp(confname, table[mid].name); cmp = strcmp(confname, table[mid].name);
......
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