aboutsummaryrefslogtreecommitdiffstats
path: root/lang/python/gpgme.i
diff options
context:
space:
mode:
Diffstat (limited to 'lang/python/gpgme.i')
-rw-r--r--lang/python/gpgme.i53
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;