Commit 8667a9b6 authored by Benjamin Peterson's avatar Benjamin Peterson

Python strings ending with '\0' should not be equivalent to their C...

Python strings ending with '\0' should not be equivalent to their C counterparts in PyUnicode_CompareWithASCIIString
parent c36c3789
......@@ -155,6 +155,9 @@ Core and Builtins
C-API
-----
- Make PyUnicode_CompareWithASCIIString return not equal if the Python string
has '\0' at the end.
- Issue #5080: The argument parsing functions PyArg_ParseTuple,
PyArg_ParseTupleAndKeywords, PyArg_VaParse,
PyArg_VaParseTupleAndKeywords and PyArg_Parse now raise a
......
......@@ -1287,6 +1287,23 @@ test_string_from_format(PyObject *self, PyObject *args)
#undef CHECK_1_FORMAT
}
static PyObject *
test_unicode_compare_with_ascii(PyObject *self) {
PyObject *py_s = PyUnicode_FromStringAndSize("str\0", 4);
int result;
if (py_s == NULL)
return NULL;
result = PyUnicode_CompareWithASCIIString(py_s, "str");
Py_DECREF(py_s);
if (!result) {
PyErr_SetString(TestError, "Python string ending in NULL "
"should not compare equal to c string.");
return NULL;
}
Py_RETURN_NONE;
};
/* This is here to provide a docstring for test_descr. */
static PyObject *
test_with_docstring(PyObject *self)
......@@ -1756,6 +1773,7 @@ static PyMethodDef TestMethods[] = {
{"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
PyDoc_STR("This is a pretty normal docstring.")},
{"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
{"test_unicode_compare_with_ascii", (PyCFunction)test_unicode_compare_with_ascii, METH_NOARGS},
{"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
{"getargs_tuple", getargs_tuple, METH_VARARGS},
{"getargs_keywords", (PyCFunction)getargs_keywords,
......
......@@ -7001,6 +7001,11 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str)
for (i = 0; id[i] && str[i]; i++)
if (id[i] != str[i])
return ((int)id[i] < (int)str[i]) ? -1 : 1;
/* This check keeps Python strings that end in '\0' from comparing equal
to C strings identical up to that point. */
if (PyUnicode_GET_SIZE(uni) != i)
/* We'll say the Python string is longer. */
return 1;
if (id[i])
return 1; /* uni is longer */
if (str[i])
......
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