Loading ...
Sorry, an error occurred while loading the content.

[PATCH] Python bindings silently truncate string values containing NUL bytes

Expand Messages
  • ZyX
    The following patch makes python bindings fail in case string have NUL bytes: diff -r fac3b8f96d30 src/if_python.c ... +++ b/src/if_python.c Sat Sep 01
    Message 1 of 1 , Sep 1, 2012
    • 0 Attachment
      The following patch makes python bindings fail in case string have NUL bytes:
      diff -r fac3b8f96d30 src/if_python.c
      --- a/src/if_python.c Sat Sep 01 21:16:33 2012 +0400
      +++ b/src/if_python.c Sat Sep 01 22:09:18 2012 +0400
      @@ -191,6 +191,7 @@
      # 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,6 +289,7 @@
      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,6 +408,7 @@
      {"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,14 +581,15 @@
      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);
      + if (PyString_AsStringAndSize(keyObject, (char **) &key, NULL) == -1) \
      + return err;
      +
      #define DICTKEY_UNREF
      #define DICTKEY_DECL

      diff -r fac3b8f96d30 src/if_python3.c
      --- a/src/if_python3.c Sat Sep 01 21:16:33 2012 +0400
      +++ b/src/if_python3.c Sat Sep 01 22:09:18 2012 +0400
      @@ -172,6 +172,7 @@
      # 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,6 +274,7 @@
      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,6 +381,7 @@
      {"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,17 +547,20 @@

      #define PYINITIALISED py3initialised

      -/* Add conversion from PyInt? */
      +#define DICTKEY_DECL PyObject *bytes = NULL;
      +
      #define DICTKEY_GET(err) \
      if (PyBytes_Check(keyObject)) \
      - key = (char_u *) PyBytes_AsString(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; \
      - key = (char_u *) PyBytes_AsString(bytes); \
      - if (key == NULL) \
      + if (PyBytes_AsStringAndSize(bytes, (char **) &key, NULL) == -1) \
      return err; \
      } \
      else \
      @@ -562,12 +568,11 @@
      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
      */

      --
      You received this message from the "vim_dev" maillist.
      Do not top-post! Type your reply below the text you are replying to.
      For more information, visit http://www.vim.org/maillist.php
    Your message has been successfully submitted and would be delivered to recipients shortly.