diff options
Diffstat (limited to 'lang/python/gpgme.i')
-rw-r--r-- | lang/python/gpgme.i | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/lang/python/gpgme.i b/lang/python/gpgme.i index dfa3775c..bc957e57 100644 --- a/lang/python/gpgme.i +++ b/lang/python/gpgme.i @@ -36,11 +36,16 @@ /* Allow use of Unicode objects, bytes, and None for strings. */ -%typemap(in) const char * { +%typemap(in) const char *(PyObject *encodedInput = NULL) { if ($input == Py_None) $1 = NULL; else if (PyUnicode_Check($input)) - $1 = PyUnicode_AsUTF8($input); + { + encodedInput = PyUnicode_AsUTF8String($input); + if (encodedInput == NULL) + return NULL; + $1 = PyBytes_AsString(encodedInput); + } else if (PyBytes_Check($input)) $1 = PyBytes_AsString($input); else { @@ -50,19 +55,35 @@ return NULL; } } -%typemap(freearg) const char * ""; +%typemap(freearg) const char * { + Py_XDECREF(encodedInput$argnum); +} /* Likewise for a list of strings. */ -%typemap(in) const char *[] (void *vector = NULL) { +%typemap(in) const char *[] (void *vector = NULL, + size_t size, + PyObject **pyVector = NULL) { /* Check if is a list */ if (PyList_Check($input)) { - size_t i, size = PyList_Size($input); + size_t i, j; + size = PyList_Size($input); $1 = (char **) (vector = malloc((size+1) * sizeof(char *))); + pyVector = calloc(sizeof *pyVector, size); for (i = 0; i < size; i++) { PyObject *o = PyList_GetItem($input,i); if (PyUnicode_Check(o)) - $1[i] = PyUnicode_AsUTF8(o); + { + pyVector[i] = PyUnicode_AsUTF8String(o); + if (pyVector[i] == NULL) + { + free(vector); + for (j = 0; j < i; j++) + Py_XDECREF(pyVector[j]); + return NULL; + } + $1[i] = PyBytes_AsString(pyVector[i]); + } else if (PyString_Check(o)) $1[i] = PyString_AsString(o); else { @@ -83,7 +104,10 @@ } } %typemap(freearg) const char *[] { + size_t i; free(vector$argnum); + for (i = 0; i < size$argnum; i++) + Py_XDECREF(pyVector$argnum[i]); } // Release returned buffers as necessary. @@ -296,13 +320,22 @@ } /* For gpgme_data_write, but should be universal. */ -%typemap(in) (const void *buffer, size_t size) { +%typemap(in) (const void *buffer, size_t size)(PyObject *encodedInput = NULL) { Py_ssize_t ssize; if ($input == Py_None) $1 = NULL, $2 = 0; else if (PyUnicode_Check($input)) - $1 = PyUnicode_AsUTF8AndSize($input, &ssize); + { + encodedInput = PyUnicode_AsUTF8String($input); + if (encodedInput == NULL) + return NULL; + if (PyBytes_AsStringAndSize(encodedInput, (char **) &$1, &ssize) == -1) + { + Py_DECREF(encodedInput); + return NULL; + } + } else if (PyBytes_Check($input)) PyBytes_AsStringAndSize($input, (char **) &$1, &ssize); else { @@ -320,7 +353,9 @@ $2 = (size_t) ssize; } } -%typemap(freearg) (const void *buffer, size_t size) ""; +%typemap(freearg) (const void *buffer, size_t size) { + Py_XDECREF(encodedInput$argnum); +} // Make types containing 'next' field to be lists %ignore next; |