From bb81c8ce3f9c879dac9975fcede878c3fb624002 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Sat, 9 Jan 2010 21:54:39 +0000 Subject: [PATCH] Merged revisions 77395 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r77395 | benjamin.peterson | 2010-01-09 15:45:28 -0600 (Sat, 09 Jan 2010) | 2 lines Python strings ending with '\0' should not be equivalent to their C counterparts in PyUnicode_CompareWithASCIIString ........ --- Misc/NEWS | 7 ++++++- Modules/_testcapimodule.c | 18 ++++++++++++++++++ Objects/unicodeobject.c | 5 +++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS b/Misc/NEWS index f4583df9ab..c09f8e6014 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -57,7 +57,6 @@ Core and Builtins - Issue #6750: A text file opened with io.open() could duplicate its output when writing from multiple threads at the same time. - Library ------- @@ -280,6 +279,12 @@ Tests - Issue #7042: Fix test_signal (test_itimer_virtual) failure on OS X 10.6. +C-API +----- + +- Make PyUnicode_CompareWithASCIIString return not equal if the Python string + has '\0' at the end. + Build ----- diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 360ddbce3e..7480733647 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -1093,6 +1093,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) @@ -1524,6 +1541,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, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 13db8c0224..62bad6db72 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6932,6 +6932,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]) -- 2.40.0