| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.657 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.657 |
| Problem: Python bindings silently truncate string values containing NUL. |
| Solution: Fail when a string contains NUL. (ZyX) |
| Files: src/if_python.c, src/if_python3.c |
| |
| |
| |
| |
| |
| *** 191,196 **** |
| --- 191,197 ---- |
| # define PyRun_SimpleString dll_PyRun_SimpleString |
| # define PyRun_String dll_PyRun_String |
| # define PyString_AsString dll_PyString_AsString |
| + # define PyString_AsStringAndSize dll_PyString_AsStringAndSize |
| # define PyString_FromString dll_PyString_FromString |
| # define PyString_FromStringAndSize dll_PyString_FromStringAndSize |
| # define PyString_Size dll_PyString_Size |
| |
| *** 288,293 **** |
| --- 289,295 ---- |
| static int(*dll_PyRun_SimpleString)(char *); |
| static PyObject *(*dll_PyRun_String)(char *, int, PyObject *, PyObject *); |
| static char*(*dll_PyString_AsString)(PyObject *); |
| + static int(*dll_PyString_AsStringAndSize)(PyObject *, char **, int *); |
| static PyObject*(*dll_PyString_FromString)(const char *); |
| static PyObject*(*dll_PyString_FromStringAndSize)(const char *, PyInt); |
| static PyInt(*dll_PyString_Size)(PyObject *); |
| |
| *** 406,411 **** |
| --- 408,414 ---- |
| {"PyRun_SimpleString", (PYTHON_PROC*)&dll_PyRun_SimpleString}, |
| {"PyRun_String", (PYTHON_PROC*)&dll_PyRun_String}, |
| {"PyString_AsString", (PYTHON_PROC*)&dll_PyString_AsString}, |
| + {"PyString_AsStringAndSize", (PYTHON_PROC*)&dll_PyString_AsStringAndSize}, |
| {"PyString_FromString", (PYTHON_PROC*)&dll_PyString_FromString}, |
| {"PyString_FromStringAndSize", (PYTHON_PROC*)&dll_PyString_FromStringAndSize}, |
| {"PyString_Size", (PYTHON_PROC*)&dll_PyString_Size}, |
| |
| *** 578,591 **** |
| static int initialised = 0; |
| #define PYINITIALISED initialised |
| |
| - /* Add conversion from PyInt? */ |
| #define DICTKEY_GET(err) \ |
| if (!PyString_Check(keyObject)) \ |
| { \ |
| PyErr_SetString(PyExc_TypeError, _("only string keys are allowed")); \ |
| return err; \ |
| } \ |
| ! key = (char_u *) PyString_AsString(keyObject); |
| #define DICTKEY_UNREF |
| #define DICTKEY_DECL |
| |
| --- 581,595 ---- |
| static int initialised = 0; |
| #define PYINITIALISED initialised |
| |
| #define DICTKEY_GET(err) \ |
| if (!PyString_Check(keyObject)) \ |
| { \ |
| PyErr_SetString(PyExc_TypeError, _("only string keys are allowed")); \ |
| return err; \ |
| } \ |
| ! if (PyString_AsStringAndSize(keyObject, (char **) &key, NULL) == -1) \ |
| ! return err; |
| ! |
| #define DICTKEY_UNREF |
| #define DICTKEY_DECL |
| |
| |
| |
| |
| *** 172,177 **** |
| --- 172,178 ---- |
| # define PyUnicode_AsEncodedString py3_PyUnicode_AsEncodedString |
| # undef PyBytes_AsString |
| # define PyBytes_AsString py3_PyBytes_AsString |
| + # define PyBytes_AsStringAndSize py3_PyBytes_AsStringAndSize |
| # undef PyBytes_FromString |
| # define PyBytes_FromString py3_PyBytes_FromString |
| # define PyFloat_FromDouble py3_PyFloat_FromDouble |
| |
| *** 273,278 **** |
| --- 274,280 ---- |
| static char* (*py3__PyUnicode_AsString)(PyObject *unicode); |
| static PyObject* (*py3_PyUnicode_AsEncodedString)(PyObject *unicode, const char* encoding, const char* errors); |
| static char* (*py3_PyBytes_AsString)(PyObject *bytes); |
| + static int (*py3_PyBytes_AsStringAndSize)(PyObject *bytes, char **buffer, int *length); |
| static PyObject* (*py3_PyBytes_FromString)(char *str); |
| static PyObject* (*py3_PyFloat_FromDouble)(double num); |
| static double (*py3_PyFloat_AsDouble)(PyObject *); |
| |
| *** 379,384 **** |
| --- 381,387 ---- |
| {"PyImport_AppendInittab", (PYTHON_PROC*)&py3_PyImport_AppendInittab}, |
| {"_PyUnicode_AsString", (PYTHON_PROC*)&py3__PyUnicode_AsString}, |
| {"PyBytes_AsString", (PYTHON_PROC*)&py3_PyBytes_AsString}, |
| + {"PyBytes_AsStringAndSize", (PYTHON_PROC*)&py3_PyBytes_AsStringAndSize}, |
| {"PyBytes_FromString", (PYTHON_PROC*)&py3_PyBytes_FromString}, |
| {"PyFloat_FromDouble", (PYTHON_PROC*)&py3_PyFloat_FromDouble}, |
| {"PyFloat_AsDouble", (PYTHON_PROC*)&py3_PyFloat_AsDouble}, |
| |
| *** 544,560 **** |
| |
| #define PYINITIALISED py3initialised |
| |
| ! /* Add conversion from PyInt? */ |
| #define DICTKEY_GET(err) \ |
| if (PyBytes_Check(keyObject)) \ |
| ! key = (char_u *) PyBytes_AsString(keyObject); \ |
| else if (PyUnicode_Check(keyObject)) \ |
| { \ |
| bytes = PyString_AsBytes(keyObject); \ |
| if (bytes == NULL) \ |
| return err; \ |
| ! key = (char_u *) PyBytes_AsString(bytes); \ |
| ! if (key == NULL) \ |
| return err; \ |
| } \ |
| else \ |
| --- 547,566 ---- |
| |
| #define PYINITIALISED py3initialised |
| |
| ! #define DICTKEY_DECL PyObject *bytes = NULL; |
| ! |
| #define DICTKEY_GET(err) \ |
| if (PyBytes_Check(keyObject)) \ |
| ! { \ |
| ! if (PyBytes_AsStringAndSize(keyObject, (char **) &key, NULL) == -1) \ |
| ! return err; \ |
| ! } \ |
| else if (PyUnicode_Check(keyObject)) \ |
| { \ |
| bytes = PyString_AsBytes(keyObject); \ |
| if (bytes == NULL) \ |
| return err; \ |
| ! if (PyBytes_AsStringAndSize(bytes, (char **) &key, NULL) == -1) \ |
| return err; \ |
| } \ |
| else \ |
| |
| *** 562,573 **** |
| PyErr_SetString(PyExc_TypeError, _("only string keys are allowed")); \ |
| return err; \ |
| } |
| #define DICTKEY_UNREF \ |
| if (bytes != NULL) \ |
| Py_XDECREF(bytes); |
| |
| - #define DICTKEY_DECL PyObject *bytes = NULL; |
| - |
| /* |
| * Include the code shared with if_python.c |
| */ |
| --- 568,578 ---- |
| PyErr_SetString(PyExc_TypeError, _("only string keys are allowed")); \ |
| return err; \ |
| } |
| + |
| #define DICTKEY_UNREF \ |
| if (bytes != NULL) \ |
| Py_XDECREF(bytes); |
| |
| /* |
| * Include the code shared with if_python.c |
| */ |
| |
| |
| |
| *** 721,722 **** |
| --- 721,724 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 657, |
| /**/ |
| |
| -- |
| Have you heard about the new Barbie doll? It's called Divorce |
| Barbie. It comes with all of Ken's stuff. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |