doc/
authorMarcus Brinkmann <mb@g10code.com>
Mon, 25 Sep 2006 14:57:00 +0000 (14:57 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Mon, 25 Sep 2006 14:57:00 +0000 (14:57 +0000)
2006-09-25  Marcus Brinkmann  <marcus@g10code.de>

        * gpgme.texi (Destroying Data Buffers): Clarify that
        gpgme_data_release_and_get_mem destroys DH unconditionally.

gpgme/
2006-09-25  Marcus Brinkmann  <marcus@g10code.de>

        * data-mem.c (gpgme_data_release_and_get_mem): Release the data
        object properly.

NEWS
doc/ChangeLog
doc/gpgme.texi
gpgme/ChangeLog
gpgme/data-mem.c

diff --git a/NEWS b/NEWS
index 05ed103..f4f85c0 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,8 @@
 Noteworthy changes in version 1.1.3 (unreleased)
 ------------------------------------------------
 
+ * Fixed a memory leak in gpgme_data_release_and_get_mem.
+
  * Interface changes relative to the 1.1.1 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
index ebe0aa4..759c289 100644 (file)
@@ -1,3 +1,8 @@
+2006-09-25  Marcus Brinkmann  <marcus@g10code.de>
+
+       * gpgme.texi (Destroying Data Buffers): Clarify that
+       gpgme_data_release_and_get_mem destroys DH unconditionally.
+
 2005-03-24  Marcus Brinkmann  <marcus@g10code.de>
 
        * gpgme.texi (Library Version Check): Make example code compatible
index 5053645..04deff3 100644 (file)
@@ -1719,7 +1719,8 @@ the user provided the data buffer in non-copy mode, a copy will be
 made for this purpose.
 
 In case an error returns, or there is no suitable data buffer that can
-be returned to the user, the function will return @code{NULL}.
+be returned to the user, the function will return @code{NULL}.  In any
+case, the data object @var{dh} is destroyed.
 @end deftypefun
 
 
index 63be946..6f27890 100644 (file)
@@ -1,3 +1,8 @@
+2006-09-25  Marcus Brinkmann  <marcus@g10code.de>
+
+       * data-mem.c (gpgme_data_release_and_get_mem): Release the data
+       object properly.
+
 2006-09-22  Marcus Brinkmann  <marcus@g10code.de>
 
        * keylist.c (keylist_colon_handler): Move debug output after
index d0896de..6e948ee 100644 (file)
@@ -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;
 }