Poor redmond man's valgrind
authorAndre Heinecke <aheinecke@intevation.de>
Mon, 23 Jul 2018 12:01:16 +0000 (14:01 +0200)
committerAndre Heinecke <aheinecke@intevation.de>
Mon, 23 Jul 2018 12:51:37 +0000 (14:51 +0200)
* src: Use x functions
* src/xmalloc.h: Provide macros for memdbg.

22 files changed:
src/common.cpp
src/common_indep.c
src/cpphelp.cpp
src/filetype.c
src/gpgoladdin.cpp
src/mail.cpp
src/mailitem-events.cpp
src/main.c
src/mapihelp.cpp
src/memdbg.cpp
src/memdbg.h
src/mimedataprovider.cpp
src/parsecontroller.cpp
src/pgpmime.c
src/revert.cpp
src/rfc2047parse.c
src/rfc822parse.c
src/vasprintf.c
src/w32-gettext.cpp
src/windowmessages.cpp
src/wks-helper.cpp
src/xmalloc.h

index 0f585eb..f3f41af 100644 (file)
@@ -188,7 +188,7 @@ readRegStr (const char *root, const char *dir, const char *name)
 /* Return a string from the Win32 Registry or NULL in case of error.
    Caller must release the return value.  A NULL for root is an alias
    for HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE in turn.  NOTE: The value
-   is allocated with a plain malloc() - use free() and not the usual
+   is allocated with a plain xmalloc () - use xfree () and not the usual
    xfree(). */
 char *
 read_w32_registry_string (const char *root, const char *dir, const char *name)
@@ -215,10 +215,10 @@ get_data_dir (void)
 
   /* Build the key: "<instdir>/share/gpgol".  */
 #define SDDIR "\\share\\gpgol"
-  dname = (char*) malloc (strlen (instdir) + strlen (SDDIR) + 1);
+  dname = (char*) xmalloc (strlen (instdir) + strlen (SDDIR) + 1);
   if (!dname)
     {
-      free (instdir);
+      xfree (instdir);
       return NULL;
     }
   p = dname;
@@ -226,7 +226,7 @@ get_data_dir (void)
   p += strlen (instdir);
   strcpy (p, SDDIR);
 
-  free (instdir);
+  xfree (instdir);
 
 #undef SDDIR
   return dname;
@@ -246,7 +246,7 @@ percent_escape (const char *str, const char *extra)
   for (i=j=0; str[i]; i++)
     if (str[i] == ':' || str[i] == '%' || (extra && strchr (extra, str[i])))
       j++;
-  ptr = (char *) malloc (i + 2 * j + 1);
+  ptr = (char *) xmalloc (i + 2 * j + 1);
   i = 0;
   while (*str)
     {
@@ -762,6 +762,7 @@ gpgol_bug (HWND parent, int code)
                 "or ask your Administrator for support.");
   char *with_code;
   gpgrt_asprintf (&with_code, "%s\nCode: %i", bugmsg, code);
+  memdbg_alloc (with_code);
   gpgol_message_box (parent,
                      with_code,
                      _("GpgOL Error"), MB_OK);
@@ -895,6 +896,7 @@ store_extension_subkey_value (const char *subkey,
   int ret;
   char *path;
   gpgrt_asprintf (&path, "%s\\%s", GPGOL_REGPATH, subkey);
+  memdbg_alloc (path);
   ret = store_config_value (HKEY_CURRENT_USER, path, key, val);
   xfree (path);
   return ret;
index 046def8..c0fe91f 100644 (file)
@@ -68,7 +68,7 @@ out_of_core (void)
 }
 
 void*
-xmalloc (size_t n)
+_xmalloc (size_t n)
 {
   void *p = malloc (n);
   if (!p)
@@ -77,7 +77,7 @@ xmalloc (size_t n)
 }
 
 void*
-xcalloc (size_t m, size_t n)
+_xcalloc (size_t m, size_t n)
 {
   void *p = calloc (m, n);
   if (!p)
@@ -86,7 +86,7 @@ xcalloc (size_t m, size_t n)
 }
 
 void *
-xrealloc (void *a, size_t n)
+_xrealloc (void *a, size_t n)
 {
   void *p = realloc (a, n);
   if (!p)
@@ -95,15 +95,26 @@ xrealloc (void *a, size_t n)
 }
 
 char*
-xstrdup (const char *s)
+_xstrdup (const char *s)
 {
-  char *p = xmalloc (strlen (s)+1);
+  char *p = _xmalloc (strlen (s)+1);
   strcpy (p, s);
   return p;
 }
 
+wchar_t*
+_xwcsdup (const wchar_t *s)
+{
+  wchar_t *p = wcsdup (s);
+  if (!s)
+    {
+      out_of_core ();
+    }
+  return p;
+}
+
 void
-xfree (void *p)
+_xfree (void *p)
 {
   if (p)
     free (p);
index 5912f81..a7a57ad 100644 (file)
@@ -42,7 +42,9 @@ release_cArray (char **carray)
   if (carray)
     {
       for (int idx = 0; carray[idx]; idx++)
-        xfree (carray[idx]);
+        {
+          xfree (carray[idx]);
+        }
       xfree (carray);
     }
 }
index c59dde7..1059daa 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "parsetlv.h"
 #include "filetype.h"
+#include "common_indep.h"
 
 
 /* The size of the buffer we use to identify CMS objects.  */
@@ -107,7 +108,7 @@ is_cms_file (const char *fname)
   if (!fp)
     return 0; /* Not found - can't be a CMS file.  */
 
-  data = malloc (CMS_BUFFER_SIZE);
+  data = xmalloc (CMS_BUFFER_SIZE);
   if (!data)
     {
       fclose (fp);
@@ -119,7 +120,7 @@ is_cms_file (const char *fname)
   fclose (fp);
 
   result = detect_cms (data, datalen);
-  free (data);
+  xfree (data);
   return result;
 }
 
@@ -138,13 +139,13 @@ is_cms_data (const char *data, size_t datalen)
   if (datalen > CMS_BUFFER_SIZE - 1)
     datalen = CMS_BUFFER_SIZE - 1;
 
-  buffer = malloc (datalen + 1);
+  buffer = xmalloc (datalen + 1);
   if (!buffer)
     return 0; /* Oops */
   memcpy (buffer, data, datalen);
   buffer[datalen] = 0;
 
   result = detect_cms (buffer, datalen);
-  free (buffer);
+  xfree (buffer);
   return result;
 }
index 5adfb20..cf58167 100644 (file)
@@ -1069,6 +1069,7 @@ GetCustomUI_MIME (BSTR RibbonID, BSTR * RibbonXml)
 
   if (buffer)
     {
+      memdbg_alloc (buffer);
       wchar_t *wbuf = utf8_to_wchar (buffer);
       xfree (buffer);
       *RibbonXml = SysAllocString (wbuf);
index 0836bba..a03a7d9 100644 (file)
@@ -903,6 +903,7 @@ do_crypt (LPVOID arg)
           char *buf = nullptr;
           gpgrt_asprintf (&buf, _("Crypto operation failed:\n%s"),
                           err.asString());
+          memdbg_alloc (buf);
           gpgol_message_box (mail->getWindow (), buf, _("GpgOL"), MB_OK);
           xfree (buf);
         }
@@ -1037,6 +1038,7 @@ Mail::decryptVerify_o ()
                      SRCNAME, __func__);
         }
     }
+  memdbg_alloc (placeholder_buf);
   xfree (placeholder_buf);
 
   /* Do the actual parsing */
@@ -1837,6 +1839,7 @@ Mail::getRecipients_o () const
               "or ask your Administrator for support.");
       char *buf;
       gpgrt_asprintf (&buf, "Failed to resolve recipients.\n\n%s\n", bugmsg);
+      memdbg_alloc (buf);
       gpgol_message_box (get_active_hwnd (),
                          buf,
                          _("GpgOL"), MB_OK);
@@ -2462,6 +2465,7 @@ Mail::getCryptoDetails_o ()
       /* Level three is the only level for trusted S/MIME keys. */
       gpgrt_asprintf (&buf, _("The senders identity is certified by the trusted issuer:\n'%s'\n"),
                       m_sig.key().issuerName());
+      memdbg_alloc (buf);
       message = buf;
       xfree (buf);
     }
@@ -2488,6 +2492,7 @@ Mail::getCryptoDetails_o ()
                               "You encrypted %i and verified %i messages since."),
                               time, m_uid.tofuInfo().encrCount(),
                               m_uid.tofuInfo().signCount ());
+      memdbg_alloc (buf);
       xfree (time);
       message = buf;
       xfree (buf);
@@ -2510,6 +2515,7 @@ Mail::getCryptoDetails_o ()
                                   "it since %s."),
                                   m_uid.tofuInfo().signCount (),
                                   m_uid.tofuInfo().encrCount (), time);
+          memdbg_alloc (buf);
           xfree (time);
           message = buf;
           xfree (buf);
@@ -2587,6 +2593,7 @@ Mail::getCryptoDetails_o ()
         {
           gpgrt_asprintf (&buf, _("does not claim the address: \"%s\"."),
                           getSender_o ().c_str());
+          memdbg_alloc (buf);
           message += buf;
           xfree (buf);
         }
index 09a9fea..f93b239 100644 (file)
@@ -315,6 +315,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
                                   "message is not open in any window and not selected in the "
                                   "messagelist.\n\nFor example by right clicking but not selecting the message.\n"),
                           wchar_to_utf8(prop_name));
+          memdbg_alloc (fmt);
           wchar_t *msg = utf8_to_wchar (fmt);
           xfree (fmt);
           MessageBoxW (get_active_hwnd(), msg, title,
index 5b6cdb7..43a34f4 100644 (file)
@@ -88,16 +88,19 @@ get_gpgme_w32_inst_dir (void)
   char *gpg4win_dir = get_gpg4win_dir ();
   char *tmp;
   gpgrt_asprintf (&tmp, "%s\\bin\\gpgme-w32spawn.exe", gpg4win_dir);
+  memdbg_alloc (tmp);
 
   if (!access(tmp, R_OK))
     {
       xfree (tmp);
       gpgrt_asprintf (&tmp, "%s\\bin", gpg4win_dir);
+      memdbg_alloc (tmp);
       xfree (gpg4win_dir);
       return tmp;
     }
   xfree (tmp);
   gpgrt_asprintf (&tmp, "%s\\gpgme-w32spawn.exe", gpg4win_dir);
+  memdbg_alloc (tmp);
 
   if (!access(tmp, R_OK))
     {
@@ -157,10 +160,10 @@ get_locale_dir (void)
 
   /* Build the key: "<instdir>/share/locale".  */
 #define SLDIR "\\share\\locale"
-  dname = malloc (strlen (instdir) + strlen (SLDIR) + 1);
+  dname = xmalloc (strlen (instdir) + strlen (SLDIR) + 1);
   if (!dname)
     {
-      free (instdir);
+      xfree (instdir);
       return NULL;
     }
   p = dname;
@@ -168,7 +171,7 @@ get_locale_dir (void)
   p += strlen (instdir);
   strcpy (p, SLDIR);
 
-  free (instdir);
+  xfree (instdir);
 
   return dname;
 }
@@ -177,7 +180,7 @@ get_locale_dir (void)
 static void
 drop_locale_dir (char *locale_dir)
 {
-  free (locale_dir);
+  xfree (locale_dir);
 }
 
 
@@ -253,7 +256,9 @@ read_options (void)
          after using the configuration dialog.  */
       store_extension_value ("enableDebug", "0");
     }
-  xfree (val); val = NULL;
+  /* Yes we use free here because memtracing did not track the alloc
+     as the option for debuging was not read before. */
+  free (val); val = NULL;
   if (opt.enable_debug)
     log_debug ("enabled debug flags:%s%s%s%s%s%s%s%s%s%s\n",
                (opt.enable_debug & DBG_IOWORKER)? " ioworker":"",
index 301f692..abf94a6 100644 (file)
@@ -112,7 +112,7 @@ create_gpgol_tag (LPMESSAGE message, const wchar_t *name, const char *func)
   HRESULT hr;
   LPSPropTagArray proparr = NULL;
   MAPINAMEID mnid, *pmnid;
-  wchar_t *propname = wcsdup (name);
+  wchar_t *propname = xwcsdup (name);
   /* {31805ab8-3e92-11dc-879c-00061b031004}: GpgOL custom properties.  */
   GUID guid = {0x31805ab8, 0x3e92, 0x11dc, {0x87, 0x9c, 0x00, 0x06,
                                             0x1b, 0x03, 0x10, 0x04}};
index aabf2a8..cb39e62 100644 (file)
@@ -33,6 +33,7 @@
 std::map <std::string, int> cppObjs;
 std::map <void *, int> olObjs;
 std::map <void *, std::string> olNames;
+std::map <void *, std::string> allocs;
 
 GPGRT_LOCK_DEFINE (memdbg_log);
 
@@ -213,7 +214,67 @@ memdbg_dtor (const char *objName)
                  SRCNAME, __func__, nameStr.c_str());
     }
   gpgrt_lock_unlock (&memdbg_log);
+}
+
+
+void
+_memdbg_alloc (void *ptr, const char *srcname, const char *func, int line)
+{
+  DBGGUARD;
+
+  if (!ptr)
+    {
+      TRACEPOINT;
+      return;
+    }
+
+  gpgrt_lock_lock (&memdbg_log);
+
+  const std::string identifier = std::string (srcname) + std::string (":") +
+                                  std::string (func) + std::string (":") +
+                                  std::to_string (line);
+
+  auto it = allocs.find (ptr);
+
+  if (it != allocs.end())
+    {
+      TRACEPOINT;
+      gpgrt_lock_unlock (&memdbg_log);
+      return;
+    }
+  allocs.insert (std::make_pair (ptr, identifier));
+
+  gpgrt_lock_unlock (&memdbg_log);
+}
+
+
+int
+memdbg_free (void *ptr)
+{
+  DBGGUARD false;
+
+  if (!ptr)
+    {
+      TRACEPOINT;
+      return false;
+    }
+
+  gpgrt_lock_lock (&memdbg_log);
+
+  auto it = allocs.find (ptr);
 
+  if (it == allocs.end())
+    {
+      log_error ("%s:%s Free unregistered: %p",
+                 SRCNAME, __func__, ptr);
+      gpgrt_lock_unlock (&memdbg_log);
+      return false;
+    }
+
+  allocs.erase (it);
+
+  gpgrt_lock_unlock (&memdbg_log);
+  return true;
 }
 
 void
@@ -249,6 +310,12 @@ memdbg_dump ()
         }
     }
   log_debug("-- OL End --");
+  log_debug("-- Allocated Addresses --");
+  for (const auto &pair: allocs)
+    {
+      log_debug ("%s: %p", pair.second.c_str(), pair.first);
+    }
+  log_debug("-- Allocated Addresses End --");
 
   log_debug(""
 "------------------------------MEMORY END ----------------------------------");
index 49e34c1..aa4939d 100644 (file)
@@ -45,6 +45,11 @@ void memdbg_released (void *obj);
 void memdbg_ctor (const char *objName);
 void memdbg_dtor (const char *objName);
 
+void _memdbg_alloc (void *ptr, const char *srcname, const char *func, int line);
+#define memdbg_alloc(X) \
+    _memdbg_alloc ((void *)X, log_srcname (__FILE__), __func__, __LINE__);
+int memdbg_free (void *ptr);
+
 void memdbg_dump(void);
 
 #ifdef __cplusplus
index e073b4b..52c7834 100644 (file)
@@ -195,7 +195,7 @@ t2body (MimeDataProvider *provider, rfc822parse_t msg)
           ctx->is_base64_encoded = 1;
           b64_init (&ctx->base64);
         }
-      free (p);
+      xfree (p);
     }
 
   /* Get the filename from the header.  */
index 9dfcc23..20753b0 100644 (file)
@@ -226,6 +226,7 @@ format_error(GpgME::DecryptionResult result, Protocol protocol)
                  SRCNAME, __func__);
       return "Failed to Format error.";
     }
+  memdbg_alloc (buf);
   msg = buf;
   return msg;
 }
@@ -304,6 +305,7 @@ ParseController::parse()
           /* Should never happen */
           m_error = std::string("Bad installation");
         }
+      memdbg_alloc (buf);
       m_error = buf;
       xfree (buf);
       return;
index 7e48f5f..f0dedfd 100644 (file)
@@ -296,7 +296,7 @@ message_cb (void *opaque, rfc822parse_event_t event, rfc822parse_t msg)
               ctx->is_base64_encoded = 1;
               b64_init (&ctx->base64);
             }
-          free (p);
+          xfree (p);
         }
 
       /* If this is a text part, decide whether we treat it as our body. */
index 1d3834d..bd0b647 100644 (file)
@@ -160,6 +160,7 @@ gpgol_mailitem_revert (LPDISPATCH mailitem)
           goto done;
         }
 
+      memdbg_alloc (item_str);
       attachment = get_oom_object (attachments, item_str);
       xfree (item_str);
       if (!attachment)
index 10fd7fc..b49af1a 100644 (file)
@@ -122,7 +122,7 @@ rfc2047_token_new_encoded_word (const char *word, size_t len)
 
   /* copy the charset into a buffer */
   n = (size_t) (inptr - tmpchar);
-  buf = malloc (n + 1);
+  buf = xmalloc (n + 1);
   memcpy (buf, tmpchar, n);
   buf[n] = '\0';
   charset = buf;
index 6df803b..7c5d5ba 100644 (file)
@@ -39,6 +39,7 @@
 #include <stdarg.h>
 #include <assert.h>
 
+#include "common_indep.h"
 #include "rfc822parse.h"
 
 enum token_type
@@ -184,7 +185,7 @@ new_part (void)
 {
   part_t part;
 
-  part = calloc (1, sizeof *part);
+  part = xcalloc (1, sizeof *part);
   if (part)
     {
       part->hdr_lines_tail = &part->hdr_lines;
@@ -207,10 +208,10 @@ release_part (part_t part)
       for (hdr = part->hdr_lines; hdr; hdr = hdr2)
         {
           hdr2 = hdr->next;
-          free (hdr);
+          xfree (hdr);
         }
-      free (part->boundary);
-      free (part);
+      xfree (part->boundary);
+      xfree (part);
     }
 }
 
@@ -231,13 +232,13 @@ release_handle_data (rfc822parse_t msg)
 rfc822parse_t
 rfc822parse_open (rfc822parse_cb_t cb, void *cb_value)
 {
-  rfc822parse_t msg = calloc (1, sizeof *msg);
+  rfc822parse_t msg = xcalloc (1, sizeof *msg);
   if (msg)
     {
       msg->parts = msg->current_part = new_part ();
       if (!msg->parts)
         {
-          free (msg);
+          xfree (msg);
           msg = NULL;
         }
       else
@@ -247,7 +248,7 @@ rfc822parse_open (rfc822parse_cb_t cb, void *cb_value)
           if (do_callback (msg, RFC822PARSE_OPEN))
             {
               release_handle_data (msg);
-              free (msg);
+              xfree (msg);
               errno = 0;/* Not meaningful after the callback.  */
               msg = NULL;
             }
@@ -264,7 +265,7 @@ rfc822parse_cancel (rfc822parse_t msg)
     {
       do_callback (msg, RFC822PARSE_CANCEL);
       release_handle_data (msg);
-      free (msg);
+      xfree (msg);
     }
 }
 
@@ -276,7 +277,7 @@ rfc822parse_close (rfc822parse_t msg)
     {
       do_callback (msg, RFC822PARSE_CLOSE);
       release_handle_data (msg);
-      free (msg);
+      xfree (msg);
     }
 }
 
@@ -354,7 +355,7 @@ transition_to_body (rfc822parse_t msg)
               if (s)
                 {
                   assert (!msg->current_part->boundary);
-                  msg->current_part->boundary = malloc (strlen (s) + 1);
+                  msg->current_part->boundary = xmalloc (strlen (s) + 1);
                   if (msg->current_part->boundary)
                     {
                       part_t part;
@@ -420,7 +421,7 @@ insert_header (rfc822parse_t msg, const unsigned char *line, size_t length)
     do_callback (msg, RFC822PARSE_BEGIN_HEADER);
 
   length = length_sans_trailing_ws (line, length);
-  hdr = malloc (sizeof (*hdr) + length);
+  hdr = xmalloc (sizeof (*hdr) + length);
   if (!hdr)
     return -1;
   hdr->next = NULL;
@@ -543,7 +544,7 @@ rfc822parse_get_field (rfc822parse_t msg, const char *name, int which,
   for (h2 = h->next; h2 && h2->cont; h2 = h2->next)
     n += strlen (h2->line) + 1;
 
-  buf = p = malloc (n);
+  buf = p = xmalloc (n);
   if (buf)
     {
       p = my_stpcpy (p, h->line);
@@ -694,7 +695,7 @@ release_token_list (TOKEN t)
       TOKEN t2 = t->next;
       /* fixme: If we have owner_pantry, put the token back to
        * this pantry so that it can be reused later */
-      free (t);
+      xfree (t);
       t = t2;
     }
 }
@@ -707,7 +708,7 @@ new_token (enum token_type type, const char *buf, size_t length)
 
   /* fixme: look through our pantries to find a suitable
    * token for reuse */
-  t = malloc (sizeof *t + length);
+  t = xmalloc (sizeof *t + length);
   if (t)
     {
       t->next = NULL;
@@ -731,7 +732,7 @@ append_to_token (TOKEN old, const char *buf, size_t length)
   size_t n = strlen (old->data);
   TOKEN t;
 
-  t = malloc (sizeof *t + n + length);
+  t = xmalloc (sizeof *t + n + length);
   if (t)
     {
       t->next = old->next;
index 62ee0ad..99149e8 100644 (file)
@@ -128,7 +128,7 @@ int_vasprintf (result, format, args)
 #ifdef TEST
   global_total_width = total_width;
 #endif
-  *result = malloc (total_width);
+  *result = xmalloc (total_width);
   if (*result != NULL)
     return vsprintf (*result, format, *args);
   else
index 430eafa..9d9a515 100644 (file)
@@ -33,6 +33,7 @@
 #include <stdint.h>
 
 #include "w32-gettext.h"
+#include "common_indep.h"
 #include "xmalloc.h"
 
 \f
@@ -1293,14 +1294,14 @@ static void
 free_domain (struct loaded_domain *domain)
 {
   struct overflow_space_s *os, *os2;
-  free (domain->data);
-  free (domain->mapped);
+  xfree (domain->data);
+  xfree (domain->mapped);
   for (os = domain->overflow_space; os; os = os2)
     {
       os2 = os->next;
-      free (os);
+      xfree (os);
     }
-  free (domain);
+  xfree (domain);
 }
 
 
@@ -1329,7 +1330,7 @@ load_domain (const char *filename)
       return NULL;
     }
 
-  data = (mo_file_header*) malloc (size);
+  data = (mo_file_header*) xmalloc (size);
   if (!data)
     {
       fclose (fp);
@@ -1344,7 +1345,7 @@ load_domain (const char *filename)
       if (nb < to_read)
        {
          fclose (fp);
-         free (data);
+         xfree (data);
          return NULL;
        }
       read_ptr += nb;
@@ -1358,14 +1359,14 @@ load_domain (const char *filename)
   if (data->magic != MAGIC && data->magic != MAGIC_SWAPPED)
     {
       /* The magic number is wrong: not a message catalog file.  */
-      free (data);
+      xfree (data);
       return NULL;
     }
 
-  domain = (loaded_domain *) calloc (1, sizeof *domain);
+  domain = (loaded_domain *) xcalloc (1, sizeof *domain);
   if (!domain)
     {
-      free (data);
+      xfree (data);
       return NULL;
     }
   domain->data = (char *) data;
@@ -1388,17 +1389,17 @@ load_domain (const char *filename)
 
     default:
       /* This is an invalid revision.  */
-      free (data);
-      free (domain);
+      xfree (data);
+      xfree (domain);
       return NULL;
     }
 
   /* Allocate an array to keep track of code page mappings.  */
-  domain->mapped = (char *) calloc (1, domain->nstrings);
+  domain->mapped = (char *) xcalloc (1, domain->nstrings);
   if (!domain->mapped)
     {
-      free (data);
-      free (domain);
+      xfree (data);
+      xfree (domain);
       return NULL;
     }
 
@@ -1421,14 +1422,14 @@ wchar_to_native (const wchar_t *string)
   if (n < 0)
     return NULL;
 
-  result = (char*) malloc (n+1);
+  result = (char*) xmalloc (n+1);
   if (!result)
     return NULL;
 
   n = WideCharToMultiByte (CP_ACP, 0, string, -1, result, n, NULL, NULL);
   if (n < 0)
     {
-      free (result);
+      xfree (result);
       return NULL;
     }
   return result;
@@ -1445,14 +1446,14 @@ native_to_wchar (const char *string)
   if (n < 0)
     return NULL;
 
-  result = (wchar_t *) malloc ((n+1) * sizeof *result);
+  result = (wchar_t *) xmalloc ((n+1) * sizeof *result);
   if (!result)
     return NULL;
 
   n = MultiByteToWideChar (CP_ACP, 0, string, -1, result, n);
   if (n < 0)
     {
-      free (result);
+      xfree (result);
       return NULL;
     }
   return result;
@@ -1474,14 +1475,14 @@ utf8_to_wchar (const char *string)
   if (n < 0)
     return NULL;
 
-  result = (wchar_t *) malloc ((n+1) * sizeof *result);
+  result = (wchar_t *) xmalloc ((n+1) * sizeof *result);
   if (!result)
     return NULL;
 
   n = MultiByteToWideChar (CP_UTF8, 0, string, -1, result, n);
   if (n < 0)
     {
-      free (result);
+      xfree (result);
       return NULL;
     }
   return result;
@@ -1549,7 +1550,7 @@ utf8_to_native (const char *string)
     return xstrdup ("[Error: utf8_to_wchar failed]");
 
   result = wchar_to_native (wstring);
-  free (wstring);
+  xfree (wstring);
   if (!result)
     result = xstrdup ("[Error: wchar_to_native failed]");
 
@@ -1572,7 +1573,7 @@ native_to_utf8 (const char *string)
     return xstrdup ("[Error: native_to_wchar failed]");
 
   result = wchar_to_utf8 (wstring);
-  free (wstring);
+  xfree (wstring);
   if (!result)
     result = xstrdup ("[Error: wchar_to_utf8 failed]");
 
@@ -1606,7 +1607,7 @@ get_string (struct loaded_domain *domain, u32 idx, int utf8)
              in the overflow_space else and mark that in the mapped
              array.  Because we expect that this won't happen too
              often, we use a simple linked list.  */
-          os = (overflow_space_s *) malloc (sizeof *os + buflen);
+          os = (overflow_space_s *) xmalloc (sizeof *os + buflen);
           if (os)
             {
               os->idx = idx;
@@ -1618,7 +1619,7 @@ get_string (struct loaded_domain *domain, u32 idx, int utf8)
           else
             p = (char *) "ERROR in GETTEXT MALLOC";
         }
-      free (buf);
+      xfree (buf);
     }
   else if (domain->mapped[idx] == 2)
     {
@@ -1684,10 +1685,10 @@ bindtextdomain (const char *domainname, const char *dirname)
       + strlen (domainname) + 3 + 1;
     char *p;
 
-    fname = (char*) malloc (len);
+    fname = (char*) xmalloc (len);
     if (!fname)
       {
-       free (catval);
+       xfree (catval);
        return NULL;
       }
 
@@ -1705,8 +1706,8 @@ bindtextdomain (const char *domainname, const char *dirname)
   }
 
   domain = load_domain (fname);
-  free (catval);
-  free (fname);
+  xfree (catval);
+  xfree (fname);
 
   /* We should not be invoked twice, but this is how you would do
      it if it happened.  */
index 4302e12..84c66b5 100644 (file)
@@ -315,7 +315,7 @@ do_async (LPVOID arg)
 void
 do_in_ui_thread_async (gpgol_wmsg_type type, void *data, int delay)
 {
-  wm_ctx_t *ctx = (wm_ctx_t *) calloc (1, sizeof (wm_ctx_t));
+  wm_ctx_t *ctx = (wm_ctx_t *) xcalloc (1, sizeof (wm_ctx_t));
   ctx->wmsg_type = type;
   ctx->data = data;
   ctx->delay = delay;
index 817c487..8ddbf35 100644 (file)
@@ -413,6 +413,7 @@ WKSHelper::notify (const char *cBox) const
                               "it easy for others to send you encrypted mail.\n\n"
                               "It's secure and free!\n\n"
                               "Register automatically?"), mbox.c_str ());
+      memdbg_alloc (buf);
       if (gpgol_message_box (get_active_hwnd (),
                              buf,
                              _("GpgOL: Pubkey directory available!"), MB_YESNO) == IDYES)
index d29eb31..5385419 100644 (file)
@@ -28,13 +28,62 @@ extern "C" {
 #endif
 
 /*-- common.c --*/
-void* xmalloc (size_t n);
-void* xcalloc (size_t m, size_t n);
-void *xrealloc (void *a, size_t n);
-char* xstrdup (const char *s);
-void  xfree (void *p);
-void out_of_core (void);
+#define xmalloc(VAR1) ({void *retval; \
+  retval = _xmalloc(VAR1); \
+  if ((opt.enable_debug & DBG_OOM_EXTRA)) \
+  { \
+    memdbg_alloc (retval); \
+  } \
+retval;})
+
+#define xcalloc(VAR1, VAR2) ({void *retval; \
+  retval = _xcalloc(VAR1, VAR2); \
+  if ((opt.enable_debug & DBG_OOM_EXTRA)) \
+  { \
+    memdbg_alloc (retval);\
+  } \
+retval;})
+
+#define xrealloc(VAR1, VAR2) ({void *retval; \
+  retval = _xrealloc (VAR1, VAR2); \
+  if ((opt.enable_debug & DBG_OOM_EXTRA)) \
+  { \
+    memdbg_alloc (retval);\
+    memdbg_free ((void*)VAR1); \
+  } \
+retval;})
+
+#define xfree(VAR1) \
+{ \
+  if (VAR1 && (opt.enable_debug & DBG_OOM_EXTRA) && !memdbg_free (VAR1)) \
+    log_debug ("%s:%s:%i %p freed here", \
+               log_srcname (__FILE__), __func__, __LINE__, VAR1); \
+  _xfree (VAR1); \
+}
+
+#define xstrdup(VAR1) ({char *retval; \
+  retval = _xstrdup (VAR1); \
+  if ((opt.enable_debug & DBG_OOM_EXTRA)) \
+  { \
+    memdbg_alloc ((void *)retval);\
+  } \
+retval;})
 
+#define xwcsdup(VAR1) ({wchar_t *retval; \
+  retval = _xwcsdup (VAR1); \
+  if ((opt.enable_debug & DBG_OOM_EXTRA)) \
+  { \
+    memdbg_alloc ((void *)retval);\
+  } \
+retval;})
+
+void* _xmalloc (size_t n);
+void* _xcalloc (size_t m, size_t n);
+void *_xrealloc (void *a, size_t n);
+char* _xstrdup (const char *s);
+wchar_t * _xwcsdup (const wchar_t *s);
+void  _xfree (void *p);
+void out_of_core (void);
 
 #ifdef __cplusplus
 }