mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
Python strings ending with '\0' should not be equivalent to their C counterparts in PyUnicode_CompareWithASCIIString
This commit is contained in:
parent
c36c3789de
commit
8667a9b6ea
3 changed files with 26 additions and 0 deletions
|
@ -155,6 +155,9 @@ Core and Builtins
|
||||||
C-API
|
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,
|
- Issue #5080: The argument parsing functions PyArg_ParseTuple,
|
||||||
PyArg_ParseTupleAndKeywords, PyArg_VaParse,
|
PyArg_ParseTupleAndKeywords, PyArg_VaParse,
|
||||||
PyArg_VaParseTupleAndKeywords and PyArg_Parse now raise a
|
PyArg_VaParseTupleAndKeywords and PyArg_Parse now raise a
|
||||||
|
|
|
@ -1287,6 +1287,23 @@ test_string_from_format(PyObject *self, PyObject *args)
|
||||||
#undef CHECK_1_FORMAT
|
#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. */
|
/* This is here to provide a docstring for test_descr. */
|
||||||
static PyObject *
|
static PyObject *
|
||||||
test_with_docstring(PyObject *self)
|
test_with_docstring(PyObject *self)
|
||||||
|
@ -1756,6 +1773,7 @@ static PyMethodDef TestMethods[] = {
|
||||||
{"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
|
{"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS,
|
||||||
PyDoc_STR("This is a pretty normal docstring.")},
|
PyDoc_STR("This is a pretty normal docstring.")},
|
||||||
{"test_string_to_double", (PyCFunction)test_string_to_double, METH_NOARGS},
|
{"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},
|
{"test_capsule", (PyCFunction)test_capsule, METH_NOARGS},
|
||||||
{"getargs_tuple", getargs_tuple, METH_VARARGS},
|
{"getargs_tuple", getargs_tuple, METH_VARARGS},
|
||||||
{"getargs_keywords", (PyCFunction)getargs_keywords,
|
{"getargs_keywords", (PyCFunction)getargs_keywords,
|
||||||
|
|
|
@ -7001,6 +7001,11 @@ PyUnicode_CompareWithASCIIString(PyObject* uni, const char* str)
|
||||||
for (i = 0; id[i] && str[i]; i++)
|
for (i = 0; id[i] && str[i]; i++)
|
||||||
if (id[i] != str[i])
|
if (id[i] != str[i])
|
||||||
return ((int)id[i] < (int)str[i]) ? -1 : 1;
|
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])
|
if (id[i])
|
||||||
return 1; /* uni is longer */
|
return 1; /* uni is longer */
|
||||||
if (str[i])
|
if (str[i])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue