diff options
Diffstat (limited to 'gpgme/data-mem.c')
-rw-r--r-- | gpgme/data-mem.c | 16 |
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; } |