|
|
|
@ -1,14 +1,37 @@
|
|
|
|
|
From 3101e381eb7ff31138aa20438ae757365e390d2c Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Jiri Kucera <sanczes@gmail.com>
|
|
|
|
|
Date: Thu, 15 Jul 2021 22:41:37 +0200
|
|
|
|
|
Subject: [PATCH] lang/python/gpgme.i: Fix memleaks
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
lang/python/gpgme.i | 85 +++++++++++++++++++++++++++------------------
|
|
|
|
|
1 file changed, 52 insertions(+), 33 deletions(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/lang/cpp/src/context.cpp b/lang/cpp/src/context.cpp
|
|
|
|
|
index c0a1dc21..e991dbc8 100644
|
|
|
|
|
--- a/lang/cpp/src/context.cpp
|
|
|
|
|
+++ b/lang/cpp/src/context.cpp
|
|
|
|
|
@@ -223,6 +223,7 @@ Context *Context::createForProtocol(Protocol proto)
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
+ gpgme_release(ctx);
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -273,6 +274,7 @@ std::unique_ptr<Context> Context::createForEngine(Engine eng, Error *error)
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
+ gpgme_release(ctx);
|
|
|
|
|
if (error) {
|
|
|
|
|
*error = Error::fromCode(GPG_ERR_INV_ARG);
|
|
|
|
|
}
|
|
|
|
|
diff --git a/lang/cpp/src/data.cpp b/lang/cpp/src/data.cpp
|
|
|
|
|
index 7a93cbc2..d08a29db 100644
|
|
|
|
|
--- a/lang/cpp/src/data.cpp
|
|
|
|
|
+++ b/lang/cpp/src/data.cpp
|
|
|
|
|
@@ -249,6 +249,7 @@ std::vector<GpgME::Key> GpgME::Data::toKeys(Protocol proto) const
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gpgme_op_keylist_from_data_start (ctx->impl()->ctx, d->data, 0)) {
|
|
|
|
|
+ delete ctx;
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
diff --git a/lang/python/gpgme.i b/lang/python/gpgme.i
|
|
|
|
|
index 87371af8..fabf9e2c 100644
|
|
|
|
|
index 87371af8..64b88d54 100644
|
|
|
|
|
--- a/lang/python/gpgme.i
|
|
|
|
|
+++ b/lang/python/gpgme.i
|
|
|
|
|
@@ -53,7 +53,7 @@
|
|
|
|
@ -20,7 +43,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
$1 = PyBytes_AsString(encodedInput);
|
|
|
|
|
}
|
|
|
|
|
else if (PyBytes_Check($input))
|
|
|
|
|
@@ -62,7 +62,7 @@
|
|
|
|
|
@@ -62,22 +62,25 @@
|
|
|
|
|
PyErr_Format(PyExc_TypeError,
|
|
|
|
|
"arg %d: expected str, bytes, or None, got %s",
|
|
|
|
|
$argnum, $input->ob_type->tp_name);
|
|
|
|
@ -29,15 +52,16 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
%typemap(freearg) const char * {
|
|
|
|
|
@@ -70,14 +70,16 @@
|
|
|
|
|
Py_XDECREF(encodedInput$argnum);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Likewise for a list of strings. */
|
|
|
|
|
-%typemap(in) const char *[] (void *vector = NULL,
|
|
|
|
|
- size_t size,
|
|
|
|
|
+%typemap(arginit) const char *[] {
|
|
|
|
|
+ $1 = NULL;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
/* Likewise for a list of strings. */
|
|
|
|
|
-%typemap(in) const char *[] (void *vector = NULL,
|
|
|
|
|
- size_t size,
|
|
|
|
|
+%typemap(in) const char *[] (size_t size,
|
|
|
|
|
PyObject **pyVector = NULL) {
|
|
|
|
|
/* Check if is a list */
|
|
|
|
@ -49,7 +73,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
pyVector = calloc(sizeof *pyVector, size);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < size; i++) {
|
|
|
|
|
@@ -86,12 +88,7 @@
|
|
|
|
|
@@ -86,12 +89,7 @@
|
|
|
|
|
{
|
|
|
|
|
pyVector[i] = PyUnicode_AsUTF8String(o);
|
|
|
|
|
if (pyVector[i] == NULL)
|
|
|
|
@ -63,7 +87,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
$1[i] = PyBytes_AsString(pyVector[i]);
|
|
|
|
|
}
|
|
|
|
|
else if (PyString_Check(o))
|
|
|
|
|
@@ -101,8 +98,7 @@
|
|
|
|
|
@@ -101,8 +99,7 @@
|
|
|
|
|
"arg %d: list must contain only str or bytes, got %s "
|
|
|
|
|
"at position %d",
|
|
|
|
|
$argnum, o->ob_type->tp_name, i);
|
|
|
|
@ -73,7 +97,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$1[i] = NULL;
|
|
|
|
|
@@ -110,14 +106,17 @@
|
|
|
|
|
@@ -110,14 +107,17 @@
|
|
|
|
|
PyErr_Format(PyExc_TypeError,
|
|
|
|
|
"arg %d: expected a list of str or bytes, got %s",
|
|
|
|
|
$argnum, $input->ob_type->tp_name);
|
|
|
|
@ -96,7 +120,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Release returned buffers as necessary. */
|
|
|
|
|
@@ -135,7 +134,7 @@
|
|
|
|
|
@@ -135,7 +135,7 @@
|
|
|
|
|
if (!PySequence_Check($input)) {
|
|
|
|
|
PyErr_Format(PyExc_ValueError, "arg %d: Expected a list of gpgme_key_t",
|
|
|
|
|
$argnum);
|
|
|
|
@ -105,7 +129,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
if((numb = PySequence_Length($input)) != 0) {
|
|
|
|
|
$1 = (gpgme_key_t*)malloc((numb+1)*sizeof(gpgme_key_t));
|
|
|
|
|
@@ -152,8 +151,7 @@
|
|
|
|
|
@@ -152,8 +152,7 @@
|
|
|
|
|
"arg %d: list must contain only gpgme_key_ts, got %s "
|
|
|
|
|
"at position %d",
|
|
|
|
|
$argnum, pypointer->ob_type->tp_name, i);
|
|
|
|
@ -115,7 +139,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
Py_DECREF(pypointer);
|
|
|
|
|
}
|
|
|
|
|
@@ -179,7 +177,7 @@
|
|
|
|
|
@@ -179,7 +178,7 @@
|
|
|
|
|
pypointer = _gpg_obj2gpgme_data_t($input, $argnum, &wrapper,
|
|
|
|
|
&bytesio, &view);
|
|
|
|
|
if (pypointer == NULL)
|
|
|
|
@ -124,7 +148,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
have_view = !! view.obj;
|
|
|
|
|
|
|
|
|
|
/* input = $input, 1 = $1, 1_descriptor = $1_descriptor */
|
|
|
|
|
@@ -189,7 +187,7 @@
|
|
|
|
|
@@ -189,7 +188,7 @@
|
|
|
|
|
if ((SWIG_ConvertPtr(pypointer,(void **) &$1, $1_descriptor,
|
|
|
|
|
SWIG_POINTER_EXCEPTION | $disown )) == -1) {
|
|
|
|
|
Py_DECREF(pypointer);
|
|
|
|
@ -133,18 +157,19 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
Py_DECREF(pypointer);
|
|
|
|
|
}
|
|
|
|
|
@@ -347,6 +345,10 @@
|
|
|
|
|
@@ -346,6 +345,11 @@
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Numeric argument expected");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Those are for gpgme_data_read() and gpgme_strerror_r(). */
|
|
|
|
|
+%typemap(arginit) (void *buffer, size_t size), (char *buf, size_t buflen) {
|
|
|
|
|
+ $1 = NULL;
|
|
|
|
|
+ $2 = 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
/* Those are for gpgme_data_read() and gpgme_strerror_r(). */
|
|
|
|
|
%typemap(in) (void *buffer, size_t size), (char *buf, size_t buflen) {
|
|
|
|
|
{
|
|
|
|
|
long tmp$argnum;
|
|
|
|
|
@@ -359,12 +361,12 @@
|
|
|
|
|
@@ -359,12 +363,12 @@
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Numeric argument expected");
|
|
|
|
@ -159,7 +184,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
$2 = (size_t) tmp$argnum;
|
|
|
|
|
$1 = ($1_ltype) malloc($2+1);
|
|
|
|
|
@@ -373,11 +375,11 @@
|
|
|
|
|
@@ -373,11 +377,11 @@
|
|
|
|
|
%typemap(argout) (void *buffer, size_t size), (char *buf, size_t buflen) {
|
|
|
|
|
Py_XDECREF($result); /* Blow away any previous result */
|
|
|
|
|
if (result < 0) { /* Check for I/O error */
|
|
|
|
@ -173,7 +198,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* For gpgme_data_write, but should be universal. */
|
|
|
|
|
@@ -390,11 +392,11 @@
|
|
|
|
|
@@ -390,11 +394,11 @@
|
|
|
|
|
{
|
|
|
|
|
encodedInput = PyUnicode_AsUTF8String($input);
|
|
|
|
|
if (encodedInput == NULL)
|
|
|
|
@ -187,7 +212,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (PyBytes_Check($input))
|
|
|
|
|
@@ -403,7 +405,7 @@
|
|
|
|
|
@@ -403,7 +407,7 @@
|
|
|
|
|
PyErr_Format(PyExc_TypeError,
|
|
|
|
|
"arg %d: expected str, bytes, or None, got %s",
|
|
|
|
|
$argnum, $input->ob_type->tp_name);
|
|
|
|
@ -196,7 +221,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (! $1)
|
|
|
|
|
@@ -432,8 +434,17 @@
|
|
|
|
|
@@ -432,8 +436,17 @@
|
|
|
|
|
size++;
|
|
|
|
|
}
|
|
|
|
|
$result = PyList_New(size);
|
|
|
|
@ -214,7 +239,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
PyList_SetItem($result, i, o);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -446,6 +457,8 @@
|
|
|
|
|
@@ -446,6 +459,8 @@
|
|
|
|
|
PyObject *fragile;
|
|
|
|
|
fragile = SWIG_NewPointerObj(SWIG_as_voidptr($1), $1_descriptor,
|
|
|
|
|
%newpointer_flags);
|
|
|
|
@ -223,7 +248,7 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
$result = _gpg_wrap_result(fragile, name);
|
|
|
|
|
Py_DECREF(fragile);
|
|
|
|
|
}
|
|
|
|
|
@@ -469,22 +482,28 @@ wrapresult(gpgme_vfs_mount_result_t, "VFSMountResult")
|
|
|
|
|
@@ -469,22 +484,28 @@ wrapresult(gpgme_vfs_mount_result_t, "VFSMountResult")
|
|
|
|
|
}
|
|
|
|
|
$result = PyList_New(size);
|
|
|
|
|
if ($result == NULL)
|
|
|
|
@ -255,43 +280,11 @@ index 87371af8..fabf9e2c 100644
|
|
|
|
|
}
|
|
|
|
|
PyList_SetItem($result, i, o);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
From b2815dcba2e75f79a6349191b3744952a9bd3311 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Jiri Kucera <sanczes@gmail.com>
|
|
|
|
|
Date: Sat, 17 Jul 2021 01:12:08 +0200
|
|
|
|
|
Subject: [PATCH] lang/cpp/src/data.cpp: Fix memleaks
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
lang/cpp/src/data.cpp | 1 +
|
|
|
|
|
1 file changed, 1 insertion(+)
|
|
|
|
|
|
|
|
|
|
diff --git a/lang/cpp/src/data.cpp b/lang/cpp/src/data.cpp
|
|
|
|
|
index 7a93cbc2..d08a29db 100644
|
|
|
|
|
--- a/lang/cpp/src/data.cpp
|
|
|
|
|
+++ b/lang/cpp/src/data.cpp
|
|
|
|
|
@@ -249,6 +249,7 @@ std::vector<GpgME::Key> GpgME::Data::toKeys(Protocol proto) const
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (gpgme_op_keylist_from_data_start (ctx->impl()->ctx, d->data, 0)) {
|
|
|
|
|
+ delete ctx;
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
From eb3bf52fcb437b0508b2912f648ac25799daef55 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Jiri Kucera <sanczes@gmail.com>
|
|
|
|
|
Date: Sat, 17 Jul 2021 01:12:45 +0200
|
|
|
|
|
Subject: [PATCH] src/engine-gpg.c: Fix memleaks
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
src/engine-gpg.c | 11 +++++++----
|
|
|
|
|
1 file changed, 7 insertions(+), 4 deletions(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
|
|
|
|
|
index b51ea173..af74714c 100644
|
|
|
|
|
index dc2d9455..a1e40fe2 100644
|
|
|
|
|
--- a/src/engine-gpg.c
|
|
|
|
|
+++ b/src/engine-gpg.c
|
|
|
|
|
@@ -1148,6 +1148,7 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
|
|
|
|
|
@@ -1122,6 +1122,7 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
|
|
|
|
|
to avoid and given that we reach this here only
|
|
|
|
|
after a malloc failure for a small object, it is
|
|
|
|
|
probably better not to do anything. */
|
|
|
|
@ -299,7 +292,7 @@ index b51ea173..af74714c 100644
|
|
|
|
|
return gpg_error (GPG_ERR_GENERAL);
|
|
|
|
|
}
|
|
|
|
|
/* If the data_type is FD, we have to do a dup2 here. */
|
|
|
|
|
@@ -1270,6 +1271,9 @@ read_status (engine_gpg_t gpg)
|
|
|
|
|
@@ -1239,6 +1240,9 @@ read_status (engine_gpg_t gpg)
|
|
|
|
|
buffer = realloc (buffer, bufsize);
|
|
|
|
|
if (!buffer)
|
|
|
|
|
return gpg_error_from_syserror ();
|
|
|
|
@ -309,7 +302,7 @@ index b51ea173..af74714c 100644
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nread = _gpgme_io_read (gpg->status.fd[0],
|
|
|
|
|
@@ -1382,8 +1386,6 @@ read_status (engine_gpg_t gpg)
|
|
|
|
|
@@ -1351,8 +1355,6 @@ read_status (engine_gpg_t gpg)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Update the gpg object. */
|
|
|
|
@ -318,7 +311,7 @@ index b51ea173..af74714c 100644
|
|
|
|
|
gpg->status.readpos = readpos;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
@@ -1423,6 +1425,9 @@ read_colon_line (engine_gpg_t gpg)
|
|
|
|
|
@@ -1392,6 +1394,9 @@ read_colon_line (engine_gpg_t gpg)
|
|
|
|
|
buffer = realloc (buffer, bufsize);
|
|
|
|
|
if (!buffer)
|
|
|
|
|
return gpg_error_from_syserror ();
|
|
|
|
@ -328,7 +321,7 @@ index b51ea173..af74714c 100644
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
nread = _gpgme_io_read (gpg->colon.fd[0], buffer+readpos, bufsize-readpos);
|
|
|
|
|
@@ -1502,8 +1507,6 @@ read_colon_line (engine_gpg_t gpg)
|
|
|
|
|
@@ -1471,8 +1476,6 @@ read_colon_line (engine_gpg_t gpg)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Update the gpg object. */
|
|
|
|
@ -337,18 +330,8 @@ index b51ea173..af74714c 100644
|
|
|
|
|
gpg->colon.readpos = readpos;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
From e94363045f104fe57188bd014c91462e3693ec24 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: Jiri Kucera <sanczes@gmail.com>
|
|
|
|
|
Date: Sat, 17 Jul 2021 01:14:14 +0200
|
|
|
|
|
Subject: [PATCH] src/engine-gpgsm.c: Fix memleaks
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
src/engine-gpgsm.c | 8 ++++++--
|
|
|
|
|
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
|
|
|
|
|
|
|
|
diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
|
|
|
|
|
index d5f0d7a9..7a8a049b 100644
|
|
|
|
|
index ae5d8ef1..1f603f19 100644
|
|
|
|
|
--- a/src/engine-gpgsm.c
|
|
|
|
|
+++ b/src/engine-gpgsm.c
|
|
|
|
|
@@ -1533,8 +1533,10 @@ gpgsm_export (void *engine, const char *pattern, gpgme_export_mode_t mode,
|
|
|
|
@ -375,3 +358,41 @@ index d5f0d7a9..7a8a049b 100644
|
|
|
|
|
gpgsm_clear_fd (gpgsm, INPUT_FD);
|
|
|
|
|
gpgsm_clear_fd (gpgsm, MESSAGE_FD);
|
|
|
|
|
gpgsm->inline_data = NULL;
|
|
|
|
|
diff --git a/src/engine.c b/src/engine.c
|
|
|
|
|
index 05979c15..7e2e3800 100644
|
|
|
|
|
--- a/src/engine.c
|
|
|
|
|
+++ b/src/engine.c
|
|
|
|
|
@@ -460,7 +460,8 @@ _gpgme_set_engine_info (gpgme_engine_info_t info, gpgme_protocol_t proto,
|
|
|
|
|
if (!new_version)
|
|
|
|
|
{
|
|
|
|
|
free (new_file_name);
|
|
|
|
|
- free (new_home_dir);
|
|
|
|
|
+ if (new_home_dir)
|
|
|
|
|
+ free (new_home_dir);
|
|
|
|
|
return gpg_error_from_syserror ();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c
|
|
|
|
|
index 7a0bfcb3..f4ddd83b 100644
|
|
|
|
|
--- a/src/gpgme-tool.c
|
|
|
|
|
+++ b/src/gpgme-tool.c
|
|
|
|
|
@@ -1189,6 +1189,7 @@ gt_get_key (gpgme_tool_t gt, const char *pattern, gpgme_key_t *r_key)
|
|
|
|
|
similar hack to sort out such duplicates but it can't
|
|
|
|
|
do that while listing keys. */
|
|
|
|
|
gpgme_key_unref (key);
|
|
|
|
|
+ key = NULL;
|
|
|
|
|
goto try_next_key;
|
|
|
|
|
}
|
|
|
|
|
if (!err)
|
|
|
|
|
diff --git a/src/keylist.c b/src/keylist.c
|
|
|
|
|
index cdb115fd..b7cbf3c3 100644
|
|
|
|
|
--- a/src/keylist.c
|
|
|
|
|
+++ b/src/keylist.c
|
|
|
|
|
@@ -1321,6 +1321,7 @@ gpgme_get_key (gpgme_ctx_t ctx, const char *fpr, gpgme_key_t *r_key,
|
|
|
|
|
similar hack to sort out such duplicates but it can't
|
|
|
|
|
do that while listing keys. */
|
|
|
|
|
gpgme_key_unref (key);
|
|
|
|
|
+ key = NULL;
|
|
|
|
|
goto try_next_key;
|
|
|
|
|
}
|
|
|
|
|
if (!err)
|