diff options
| author | Justus Winter <[email protected]> | 2016-09-12 15:11:19 +0000 | 
|---|---|---|
| committer | Justus Winter <[email protected]> | 2016-09-12 15:11:19 +0000 | 
| commit | 1d5bbbf1185a0d1f82750f10b69dad3999f7ef4c (patch) | |
| tree | 0ea7ec45e4ef6aeea618f1b006eabc55e05e3901 /lang/python/helpers.c | |
| parent | python: Avoid hardcoding the interpreter. (diff) | |
| download | gpgme-1d5bbbf1185a0d1f82750f10b69dad3999f7ef4c.tar.gz gpgme-1d5bbbf1185a0d1f82750f10b69dad3999f7ef4c.zip | |
python: Make type translation compatible with Python 2.7.
* lang/python/gpgme.i: Avoid functions not available in Python 2.7.
* lang/python/helpers.c: Likewise.
Signed-off-by: Justus Winter <[email protected]>
Diffstat (limited to '')
| -rw-r--r-- | lang/python/helpers.c | 38 | 
1 files changed, 34 insertions, 4 deletions
| diff --git a/lang/python/helpers.c b/lang/python/helpers.c index 0b4a7736..6e63c97a 100644 --- a/lang/python/helpers.c +++ b/lang/python/helpers.c @@ -191,14 +191,17 @@ _pyme_obj2gpgme_t(PyObject *input, const char *objtype, int argnum)    pyname = PyObject_GetAttrString(input, "_ctype");    if (pyname && PyUnicode_Check(pyname))      { -      if (strcmp(PyUnicode_AsUTF8(pyname), objtype) != 0) +      PyObject *encoded = PyUnicode_AsUTF8String(pyname); +      if (strcmp(PyBytes_AsString(encoded), objtype) != 0)          {            PyErr_Format(PyExc_TypeError,                         "arg %d: Expected value of type %s, but got %s", -                       argnum, objtype, PyUnicode_AsUTF8(pyname)); +                       argnum, objtype, PyBytes_AsString(encoded)); +          Py_DECREF(encoded);            Py_DECREF(pyname);            return NULL;          } +      Py_DECREF(encoded);      }    else      return NULL; @@ -334,6 +337,7 @@ static gpgme_error_t pyPassphraseCb(void *hook,    PyObject *args = NULL;    PyObject *retval = NULL;    PyObject *dataarg = NULL; +  PyObject *encoded = NULL;    gpgme_error_t err_status = 0;    _pyme_exception_init(); @@ -388,7 +392,17 @@ static gpgme_error_t pyPassphraseCb(void *hook,        else if (PyUnicode_Check(retval))          {            Py_ssize_t ssize; -          buf = PyUnicode_AsUTF8AndSize(retval, &ssize); +          encoded = PyUnicode_AsUTF8String(retval); +          if (encoded == NULL) +            { +              err_status = gpg_error(GPG_ERR_GENERAL); +              goto leave; +            } +          if (PyBytes_AsStringAndSize(encoded, &buf, &ssize) == -1) +            { +              err_status = gpg_error(GPG_ERR_GENERAL); +              goto leave; +            }            assert (! buf || ssize >= 0);            len = (size_t) ssize;          } @@ -418,6 +432,7 @@ static gpgme_error_t pyPassphraseCb(void *hook,    if (err_status)      _pyme_stash_callback_exception(self); +  Py_XDECREF(encoded);    return err_status;  } @@ -676,10 +691,23 @@ gpgme_error_t _pyme_edit_cb(void *opaque, gpgme_status_code_t status,      err_status = _pyme_exception2code();    } else {      if (fd>=0 && retval && PyUnicode_Check(retval)) { +      PyObject *encoded = NULL;        const char *buffer;        Py_ssize_t size; -      buffer = PyUnicode_AsUTF8AndSize(retval, &size); +      encoded = PyUnicode_AsUTF8String(retval); +      if (encoded == NULL) +        { +          err_status = gpg_error(GPG_ERR_GENERAL); +          goto leave; +        } +      if (PyBytes_AsStringAndSize(encoded, &buffer, &size) == -1) +        { +          Py_DECREF(encoded); +          err_status = gpg_error(GPG_ERR_GENERAL); +          goto leave; +        } +        if (write(fd, buffer, size) < 0) {          err_status = gpgme_error_from_syserror ();          _pyme_raise_exception (err_status); @@ -688,8 +716,10 @@ gpgme_error_t _pyme_edit_cb(void *opaque, gpgme_status_code_t status,          err_status = gpgme_error_from_syserror ();          _pyme_raise_exception (err_status);        } +      Py_DECREF(encoded);      }    } + leave:    if (err_status)      _pyme_stash_callback_exception(self); | 
