aboutsummaryrefslogtreecommitdiffstats
path: root/gpgme/data-mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'gpgme/data-mem.c')
-rw-r--r--gpgme/data-mem.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/gpgme/data-mem.c b/gpgme/data-mem.c
index d0896deb..6e948ee0 100644
--- a/gpgme/data-mem.c
+++ b/gpgme/data-mem.c
@@ -210,20 +210,32 @@ gpgme_data_release_and_get_mem (gpgme_data_t dh, size_t *r_len)
char *str = NULL;
if (!dh || dh->cbs != &mem_cbs)
- return NULL;
+ {
+ gpgme_data_release (dh);
+ return NULL;
+ }
str = dh->data.mem.buffer;
if (!str && dh->data.mem.orig_buffer)
{
str = malloc (dh->data.mem.length);
if (!str)
- return NULL;
+ {
+ gpgme_data_release (dh);
+ return NULL;
+ }
memcpy (str, dh->data.mem.orig_buffer, dh->data.mem.length);
}
+ else
+ /* Prevent mem_release from releasing the buffer memory. We must
+ not fail from this point. */
+ dh->data.mem.buffer = NULL;
if (r_len)
*r_len = dh->data.mem.length;
+ gpgme_data_release (dh);
+
return str;
}