[git] GpgOL - branch, master, updated. gpgol-2.2.0-106-g26d222d

by Andre Heinecke cvs at cvs.gnupg.org
Mon Jul 23 14:51:42 CEST 2018


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GnuPG extension for MS Outlook".

The branch, master has been updated
       via  26d222dfd48c4726d2699a9ec40df5dd6ecafe1f (commit)
       via  bf3ed229470a0c4691e3cb06855ba24caaa99008 (commit)
       via  2a4f79650b1e1876f71ec9c7a5d9dfa95a3a293c (commit)
       via  f4c21ec09d8451294a3137532bde7ae77993e34c (commit)
       via  c1085f44e1771bacf5fca24faca9c45cc6f7bd35 (commit)
       via  efaddd81771b267b155595df4f43d3e1b72cd100 (commit)
       via  b881eebb0d89e7ce000b01a96c35d137ba558509 (commit)
       via  1020ddceb349e508cadcae8155708bd3d5937aa9 (commit)
       via  dff52c1a96c4b28ee2c5f66493d19507dacda5ca (commit)
       via  9dfe1f112bc5da8d5b2240547c8fcc2751ff895b (commit)
       via  945d6a7dd8841c40bfe5986baa4a0d65c26f9c6b (commit)
      from  a9c34f58409c799ef22289d3bcf64b87866997c6 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 26d222dfd48c4726d2699a9ec40df5dd6ecafe1f
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Mon Jul 23 14:01:16 2018 +0200

    Poor redmond man's valgrind
    
    * src: Use x functions
    * src/xmalloc.h: Provide macros for memdbg.

diff --git a/src/common.cpp b/src/common.cpp
index 0f585eb..f3f41af 100644
--- a/src/common.cpp
+++ b/src/common.cpp
@@ -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;
diff --git a/src/common_indep.c b/src/common_indep.c
index 046def8..c0fe91f 100644
--- a/src/common_indep.c
+++ b/src/common_indep.c
@@ -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);
diff --git a/src/cpphelp.cpp b/src/cpphelp.cpp
index 5912f81..a7a57ad 100644
--- a/src/cpphelp.cpp
+++ b/src/cpphelp.cpp
@@ -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);
     }
 }
diff --git a/src/filetype.c b/src/filetype.c
index c59dde7..1059daa 100644
--- a/src/filetype.c
+++ b/src/filetype.c
@@ -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;
 }
diff --git a/src/gpgoladdin.cpp b/src/gpgoladdin.cpp
index 5adfb20..cf58167 100644
--- a/src/gpgoladdin.cpp
+++ b/src/gpgoladdin.cpp
@@ -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);
diff --git a/src/mail.cpp b/src/mail.cpp
index 0836bba..a03a7d9 100644
--- a/src/mail.cpp
+++ b/src/mail.cpp
@@ -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);
         }
diff --git a/src/mailitem-events.cpp b/src/mailitem-events.cpp
index 09a9fea..f93b239 100644
--- a/src/mailitem-events.cpp
+++ b/src/mailitem-events.cpp
@@ -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,
diff --git a/src/main.c b/src/main.c
index 5b6cdb7..43a34f4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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":"",
diff --git a/src/mapihelp.cpp b/src/mapihelp.cpp
index 301f692..abf94a6 100644
--- a/src/mapihelp.cpp
+++ b/src/mapihelp.cpp
@@ -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}};
diff --git a/src/memdbg.cpp b/src/memdbg.cpp
index aabf2a8..cb39e62 100644
--- a/src/memdbg.cpp
+++ b/src/memdbg.cpp
@@ -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 ----------------------------------");
diff --git a/src/memdbg.h b/src/memdbg.h
index 49e34c1..aa4939d 100644
--- a/src/memdbg.h
+++ b/src/memdbg.h
@@ -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
diff --git a/src/mimedataprovider.cpp b/src/mimedataprovider.cpp
index e073b4b..52c7834 100644
--- a/src/mimedataprovider.cpp
+++ b/src/mimedataprovider.cpp
@@ -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.  */
diff --git a/src/parsecontroller.cpp b/src/parsecontroller.cpp
index 9dfcc23..20753b0 100644
--- a/src/parsecontroller.cpp
+++ b/src/parsecontroller.cpp
@@ -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;
diff --git a/src/pgpmime.c b/src/pgpmime.c
index 7e48f5f..f0dedfd 100644
--- a/src/pgpmime.c
+++ b/src/pgpmime.c
@@ -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. */
diff --git a/src/revert.cpp b/src/revert.cpp
index 1d3834d..bd0b647 100644
--- a/src/revert.cpp
+++ b/src/revert.cpp
@@ -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)
diff --git a/src/rfc2047parse.c b/src/rfc2047parse.c
index 10fd7fc..b49af1a 100644
--- a/src/rfc2047parse.c
+++ b/src/rfc2047parse.c
@@ -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;
diff --git a/src/rfc822parse.c b/src/rfc822parse.c
index 6df803b..7c5d5ba 100644
--- a/src/rfc822parse.c
+++ b/src/rfc822parse.c
@@ -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;
diff --git a/src/vasprintf.c b/src/vasprintf.c
index 62ee0ad..99149e8 100644
--- a/src/vasprintf.c
+++ b/src/vasprintf.c
@@ -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
diff --git a/src/w32-gettext.cpp b/src/w32-gettext.cpp
index 430eafa..9d9a515 100644
--- a/src/w32-gettext.cpp
+++ b/src/w32-gettext.cpp
@@ -33,6 +33,7 @@
 #include <stdint.h>
 
 #include "w32-gettext.h"
+#include "common_indep.h"
 #include "xmalloc.h"
 
 

@@ -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.  */
diff --git a/src/windowmessages.cpp b/src/windowmessages.cpp
index 4302e12..84c66b5 100644
--- a/src/windowmessages.cpp
+++ b/src/windowmessages.cpp
@@ -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;
diff --git a/src/wks-helper.cpp b/src/wks-helper.cpp
index 817c487..8ddbf35 100644
--- a/src/wks-helper.cpp
+++ b/src/wks-helper.cpp
@@ -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)
diff --git a/src/xmalloc.h b/src/xmalloc.h
index d29eb31..5385419 100644
--- a/src/xmalloc.h
+++ b/src/xmalloc.h
@@ -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
 }

commit bf3ed229470a0c4691e3cb06855ba24caaa99008
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Mon Jul 23 13:54:27 2018 +0200

    Fix tmp path naming if name exists
    
    * src/common.cpp (get_tmp_outfile): Fix name.

diff --git a/src/common.cpp b/src/common.cpp
index 9c0d6e2..0f585eb 100644
--- a/src/common.cpp
+++ b/src/common.cpp
@@ -489,11 +489,11 @@ get_tmp_outfile (wchar_t *name, HANDLE *outHandle)
       // OutNameC is now without an extension and if
       // there is a file ext it now points to the extension.
 
-      outName = tmpPath + outNameC + std::to_string(tries++);
+      outName = outNameC + std::string("_") + std::to_string(tries++);
 
       if (fileExt)
         {
-          outName += fileExt;
+          outName += std::string(".") + fileExt;
         }
       xfree (outNameC);
 

commit 2a4f79650b1e1876f71ec9c7a5d9dfa95a3a293c
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Mon Jul 23 13:04:34 2018 +0200

    strdup -> xstrdup
    
    --

diff --git a/src/common.cpp b/src/common.cpp
index 689a0b9..9c0d6e2 100644
--- a/src/common.cpp
+++ b/src/common.cpp
@@ -198,7 +198,7 @@ read_w32_registry_string (const char *root, const char *dir, const char *name)
     {
       return nullptr;
     }
-  return strdup (ret.c_str ());
+  return xstrdup (ret.c_str ());
 }
 
 /* Return the data dir used for forms etc.   Returns NULL on error. */
@@ -468,7 +468,7 @@ get_tmp_outfile (wchar_t *name, HANDLE *outHandle)
       log_debug_w32 (-1, "%s:%s: Failed to open candidate '%s'",
                      SRCNAME, __func__, outName.c_str());
 
-      char *outNameC = strdup (outName.c_str());
+      char *outNameC = xstrdup (outName.c_str());
 
       const auto lastBackslash = strrchr (outNameC, '\\');
       if (!lastBackslash)
diff --git a/src/cpphelp.cpp b/src/cpphelp.cpp
index 2dc25a4..5912f81 100644
--- a/src/cpphelp.cpp
+++ b/src/cpphelp.cpp
@@ -76,7 +76,7 @@ vector_to_cArray(const std::vector<std::string> &vec)
   char ** ret = (char**) xmalloc (sizeof (char*) * (vec.size() + 1));
   for (size_t i = 0; i < vec.size(); i++)
     {
-      ret[i] = strdup (vec[i].c_str());
+      ret[i] = xstrdup (vec[i].c_str());
     }
   ret[vec.size()] = NULL;
   return ret;
diff --git a/src/mapihelp.cpp b/src/mapihelp.cpp
index afe6d7f..301f692 100644
--- a/src/mapihelp.cpp
+++ b/src/mapihelp.cpp
@@ -326,7 +326,7 @@ mapi_get_uid (LPMESSAGE msg)
     }
   else if (PROP_TYPE (propval->ulPropTag) == PT_STRING8)
     {
-      ret = strdup (propval->Value.lpszA);
+      ret = xstrdup (propval->Value.lpszA);
       log_debug ("%s:%s: Fund uuid in MAPI for %p",
                  SRCNAME, __func__, msg);
     }
diff --git a/src/memdbg.cpp b/src/memdbg.cpp
index 0a50513..aabf2a8 100644
--- a/src/memdbg.cpp
+++ b/src/memdbg.cpp
@@ -53,7 +53,7 @@ register_name (void *obj, const char *nameSuggestion)
 
   if (!name && nameSuggestion)
     {
-      name = strdup (nameSuggestion);
+      name = xstrdup (nameSuggestion);
       suggestionUsed = true;
     }
   if (!name)
diff --git a/src/mimemaker.cpp b/src/mimemaker.cpp
index 4dd55a9..216acdf 100644
--- a/src/mimemaker.cpp
+++ b/src/mimemaker.cpp
@@ -176,7 +176,7 @@ create_mapi_attachment (LPMESSAGE message, sink_t sink,
 
   /* We better insert a short filename. */
   prop.ulPropTag = PR_ATTACH_FILENAME_A;
-  prop.Value.lpszA = strdup (MIMEATTACHFILENAME);
+  prop.Value.lpszA = xstrdup (MIMEATTACHFILENAME);
   hr = HrSetOneProp ((LPMAPIPROP)att, &prop);
   xfree (prop.Value.lpszA);
   if (hr)
@@ -197,8 +197,8 @@ create_mapi_attachment (LPMESSAGE message, sink_t sink,
   if (!hr)
     {
       prop.ulPropTag = PR_ATTACH_MIME_TAG_A;
-      prop.Value.lpszA = overrideMimeTag ? strdup (overrideMimeTag) :
-                         strdup ("multipart/signed");
+      prop.Value.lpszA = overrideMimeTag ? xstrdup (overrideMimeTag) :
+                         xstrdup ("multipart/signed");
       if (overrideMimeTag)
         {
           log_debug ("%s:%s: using override mimetag: %s\n",
@@ -1150,11 +1150,11 @@ finalize_message (LPMESSAGE message, mapi_attach_item_t *att_table,
   prop.ulPropTag = PR_MESSAGE_CLASS_A;
   if (encrypt)
     {
-      prop.Value.lpszA = strdup ("IPM.Note.InfoPathForm.GpgOL.SMIME.MultipartSigned");
+      prop.Value.lpszA = xstrdup ("IPM.Note.InfoPathForm.GpgOL.SMIME.MultipartSigned");
     }
   else
     {
-      prop.Value.lpszA = strdup ("IPM.Note.InfoPathForm.GpgOLS.SMIME.MultipartSigned");
+      prop.Value.lpszA = xstrdup ("IPM.Note.InfoPathForm.GpgOLS.SMIME.MultipartSigned");
     }
 
   if (!is_inline)
diff --git a/src/mlang-charset.cpp b/src/mlang-charset.cpp
index eb4cc85..e9b327a 100644
--- a/src/mlang-charset.cpp
+++ b/src/mlang-charset.cpp
@@ -48,7 +48,7 @@ char *ansi_charset_to_utf8 (const char *charset, const char *input,
     {
       log_debug ("%s:%s: No charset / codepage returning plain.",
                  SRCNAME, __func__);
-      return strdup (input);
+      return xstrdup (input);
     }
 
   CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER,
@@ -84,7 +84,7 @@ char *ansi_charset_to_utf8 (const char *charset, const char *input,
           log_error ("%s:%s: Failed to find charset for: %s",
                      SRCNAME, __func__, charset);
           gpgol_release (multilang);
-          return strdup(input);
+          return xstrdup (input);
         }
       enc = (mime_info.uiInternetEncoding == 0) ? mime_info.uiCodePage :
                                                   mime_info.uiInternetEncoding;
diff --git a/src/oomhelp.cpp b/src/oomhelp.cpp
index 1a11560..297fe0b 100644
--- a/src/oomhelp.cpp
+++ b/src/oomhelp.cpp
@@ -1918,7 +1918,7 @@ generate_uid ()
   unsigned char *str;
   UuidToStringA (&uuid, &str);
 
-  char *ret = strdup ((char*)str);
+  char *ret = xstrdup ((char*)str);
   RpcStringFreeA (&str);
 
   return ret;
@@ -1956,7 +1956,7 @@ get_unique_id (LPDISPATCH mail, int create, const char *uuid)
     }
   else
     {
-      newuid = strdup (uuid);
+      newuid = xstrdup (uuid);
     }
   int ret = put_pa_string (mail, GPGOL_UID_DASL, newuid);
 
diff --git a/src/rfc2047parse.c b/src/rfc2047parse.c
index 56e5dba..10fd7fc 100644
--- a/src/rfc2047parse.c
+++ b/src/rfc2047parse.c
@@ -652,7 +652,7 @@ rfc2047_parse (const char *input)
 {
   char *decoded;
   if (!input)
-    return strdup ("");
+    return xstrdup ("");
 
   log_debug ("%s:%s: Input: \"%s\"",
              SRCNAME, __func__, input);
@@ -665,7 +665,7 @@ rfc2047_parse (const char *input)
   if (!decoded || !strlen (decoded))
     {
       xfree (decoded);
-      return strdup (input);
+      return xstrdup (input);
     }
   return decoded;
 }
diff --git a/src/w32-gettext.cpp b/src/w32-gettext.cpp
index b89bc79..430eafa 100644
--- a/src/w32-gettext.cpp
+++ b/src/w32-gettext.cpp
@@ -1596,7 +1596,7 @@ get_string (struct loaded_domain *domain, u32 idx, int utf8)
       domain->mapped[idx] = 1;
 
       plen = strlen (p);
-      buf = utf8 ? strdup (p) : utf8_to_native (p);
+      buf = utf8 ? xstrdup (p) : utf8_to_native (p);
       buflen = strlen (buf);
       if (buflen <= plen)
         strcpy (p, buf);
diff --git a/src/wks-helper.cpp b/src/wks-helper.cpp
index 109ecab..817c487 100644
--- a/src/wks-helper.cpp
+++ b/src/wks-helper.cpp
@@ -300,7 +300,7 @@ WKSHelper::start_check (const std::string &mbox, bool forced) const
   log_debug ("%s:%s: WKSHelper starting check",
              SRCNAME, __func__);
   /* Start the actual work that can be done in a background thread. */
-  CloseHandle (CreateThread (nullptr, 0, do_check, strdup (mbox.c_str ()), 0,
+  CloseHandle (CreateThread (nullptr, 0, do_check, xstrdup (mbox.c_str ()), 0,
                              nullptr));
   return;
 }
@@ -386,7 +386,7 @@ WKSHelper::allow_notify (int sleepTimeMS) const
       if (pair.second == ConfirmationSeen ||
           pair.second == NeedsPublish)
         {
-          auto *args = new std::pair<char *, int> (strdup (pair.first.c_str()),
+          auto *args = new std::pair<char *, int> (xstrdup (pair.first.c_str()),
                                                    sleepTimeMS);
           CloseHandle (CreateThread (nullptr, 0, do_notify,
                                      args, 0,

commit f4c21ec09d8451294a3137532bde7ae77993e34c
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Mon Jul 23 09:42:59 2018 +0200

    Remove unused code
    
    * src/main.c (create_initialization_vector)
    (get_crypt_random): Removed.

diff --git a/src/main.c b/src/main.c
index 9d723bd..5b6cdb7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -59,29 +59,6 @@ initialize_main (void)
   return log_mutex? 0 : -1;
 }
 
-/* Return nbytes of cryptographic strong random.  Caller needs to free
-   the returned buffer.  */
-static char *
-get_crypt_random (size_t nbytes)
-{
-  HCRYPTPROV prov;
-  char *buffer;
-
-  if (!CryptAcquireContext (&prov, NULL, NULL, PROV_RSA_FULL,
-                            (CRYPT_VERIFYCONTEXT|CRYPT_SILENT)) )
-    return NULL;
-
-  buffer = xmalloc (nbytes);
-  if (!CryptGenRandom (prov, nbytes, buffer))
-    {
-      xfree (buffer);
-      buffer = NULL;
-    }
-  CryptReleaseContext (prov, 0);
-  return buffer;
-}
-
-
 void
 i18n_init (void)
 {
@@ -167,14 +144,6 @@ DllMain (HINSTANCE hinst, DWORD reason, LPVOID reserved)
   return TRUE;
 }
 
-/* Return a new allocated IV of size NBYTES.  Caller must free it.  On
-   error NULL is returned. */
-void *
-create_initialization_vector (size_t nbytes)
-{
-  return get_crypt_random (nbytes);
-}
-
 static char *
 get_locale_dir (void)
 {

commit c1085f44e1771bacf5fca24faca9c45cc6f7bd35
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Mon Jul 23 09:31:51 2018 +0200

    Make async encryption optional
    
    * src/common_indep.h (opt): Add sync_enc.
    * src/mail.cpp (Mail::isAsynCryptDisabled_o): Respect it.
    * src/main.c (read_options): Read it.
    
    --
    If we have users where GpgOL crashes on send we or the
    user might want to disable async encryption.
    
    GnuPG-Bug-Id: T3838

diff --git a/src/common_indep.h b/src/common_indep.h
index 0997594..7175cf9 100644
--- a/src/common_indep.h
+++ b/src/common_indep.h
@@ -197,6 +197,7 @@ struct
   int reply_crypt;           /* Only for Addin. Encrypt / Sign based on cryptostatus. */
   int automation;            /* General automation */
   int autotrust;             /* TOFU configured for GpgOL */
+  int sync_enc;              /* Disabed async encryption */
   int prefer_smime;          /* S/MIME prefered when autoresolving */
   int smime_html_warn_shown; /* Flag to save if unsigned smime warning was shown */
 
diff --git a/src/mail.cpp b/src/mail.cpp
index ad76238..0836bba 100644
--- a/src/mail.cpp
+++ b/src/mail.cpp
@@ -71,8 +71,6 @@ static Mail *s_last_mail;
 
 #define COPYBUFSIZE (8 * 1024)
 
-#define DO_ASYNC_CRYPTO
-
 Mail::Mail (LPDISPATCH mailitem) :
     m_mailitem(mailitem),
     m_processed(false),
@@ -3018,7 +3016,13 @@ Mail::check_inline_response ()
 /* Async sending might lead to crashes when the send invocation is done.
  * For now we treat every mail as an inline response to disable async
  * encryption. :-( For more details see: T3838 */
-#ifdef DO_ASYNC_CRYPTO
+
+  if (opt.sync_enc)
+    {
+      m_async_crypt_disabled = true;
+      return m_async_crypt_disabled;
+    }
+
   m_async_crypt_disabled = false;
   LPDISPATCH app = GpgolAddin::get_instance ()->get_application ();
   if (!app)
@@ -3058,9 +3062,6 @@ Mail::check_inline_response ()
       m_async_crypt_disabled = true;
     }
   xfree (inlineSubject);
-#else
-  m_async_crypt_disabled = true;
-#endif
 
   return m_async_crypt_disabled;
 }
diff --git a/src/main.c b/src/main.c
index 12754fb..9d723bd 100644
--- a/src/main.c
+++ b/src/main.c
@@ -309,6 +309,7 @@ read_options (void)
   opt.automation = get_conf_bool ("automation", 1);
   opt.autosecure = get_conf_bool ("autosecure", 1);
   opt.autotrust = get_conf_bool ("autotrust", 0);
+  opt.sync_enc = get_conf_bool ("syncEnc", 0);
   opt.smime_html_warn_shown = get_conf_bool ("smimeHtmlWarnShown", 0);
 
   if (!opt.automation)

commit efaddd81771b267b155595df4f43d3e1b72cd100
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Mon Jul 23 08:15:30 2018 +0200

    Improve invalidation blocking
    
    * src/mail.cpp (do_parsing): Don't use invalidation_lock. We now have
    block invalidation.
    * src/mailitem-events.cpp (Read): Delay invalidate.
    * src/windowmessages.cpp (delayed_invalidate_ui): Take sleep param.
    (INVALIDATE_UI): Respect invalidation blocked.
    * src/windowmessages.h: Update accordingly.
    
    --
    This works much better then the try to archive minimizing
    invalidations by using a lock.

diff --git a/src/mail.cpp b/src/mail.cpp
index ba134d2..ad76238 100644
--- a/src/mail.cpp
+++ b/src/mail.cpp
@@ -741,7 +741,6 @@ do_parsing (LPVOID arg)
   gpgrt_lock_unlock (&dtor_lock);
 
   gpgrt_lock_lock (&parser_lock);
-  gpgrt_lock_lock (&invalidate_lock);
   /* We lock the parser here to avoid too many
      decryption attempts if there are
      multiple mailobjects which might have already
@@ -755,7 +754,6 @@ do_parsing (LPVOID arg)
     {
       log_debug ("%s:%s: cancel for: %p already deleted",
                  SRCNAME, __func__, arg);
-      gpgrt_lock_unlock (&invalidate_lock);
       gpgrt_lock_unlock (&parser_lock);
       unblockInv();
       return 0;
@@ -765,14 +763,12 @@ do_parsing (LPVOID arg)
     {
       log_error ("%s:%s: no parser found for mail: %p",
                  SRCNAME, __func__, arg);
-      gpgrt_lock_unlock (&invalidate_lock);
       gpgrt_lock_unlock (&parser_lock);
       unblockInv();
       return -1;
     }
   parser->parse();
   do_in_ui_thread (PARSING_DONE, arg);
-  gpgrt_lock_unlock (&invalidate_lock);
   gpgrt_lock_unlock (&parser_lock);
   unblockInv();
   return 0;
@@ -1410,7 +1406,7 @@ Mail::parsing_done()
 
   log_debug ("%s:%s: Delayed invalidate to update sigstate.",
              SRCNAME, __func__);
-  CloseHandle(CreateThread (NULL, 0, delayed_invalidate_ui, (LPVOID) this, 0,
+  CloseHandle(CreateThread (NULL, 0, delayed_invalidate_ui, (LPVOID) 300, 0,
                             NULL));
   TRACEPOINT;
   return;
diff --git a/src/mailitem-events.cpp b/src/mailitem-events.cpp
index 0769df1..09a9fea 100644
--- a/src/mailitem-events.cpp
+++ b/src/mailitem-events.cpp
@@ -188,7 +188,7 @@ EVENT_SINK_INVOKE(MailItemEvents)
               log_debug ("%s:%s: Non crypto mail %p opened. Updating sigstatus.",
                          SRCNAME, __func__, m_mail);
               /* Ensure that no wrong sigstatus is shown */
-              CloseHandle(CreateThread (NULL, 0, delayed_invalidate_ui, (LPVOID) this, 0,
+              CloseHandle(CreateThread (NULL, 0, delayed_invalidate_ui, (LPVOID) 300, 0,
                                         NULL));
               break;
             }
diff --git a/src/windowmessages.cpp b/src/windowmessages.cpp
index 9b5c46b..4302e12 100644
--- a/src/windowmessages.cpp
+++ b/src/windowmessages.cpp
@@ -33,6 +33,7 @@
 
 /* Singleton window */
 static HWND g_responder_window = NULL;
+static int invalidation_blocked = 0;
 
 LONG_PTR WINAPI
 gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
@@ -98,11 +99,20 @@ gpgol_window_proc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
             }
           case (INVALIDATE_UI):
             {
-              log_debug ("%s:%s: Invalidating UI",
-                         SRCNAME, __func__);
-              gpgoladdin_invalidate_ui();
-              log_debug ("%s:%s: Invalidation done",
-                         SRCNAME, __func__);
+              if (!invalidation_blocked)
+                {
+                  log_debug ("%s:%s: Invalidating UI",
+                             SRCNAME, __func__);
+                  gpgoladdin_invalidate_ui();
+                  log_debug ("%s:%s: Invalidation done",
+                             SRCNAME, __func__);
+                }
+              else
+                {
+                  log_debug ("%s:%s: Received invalidation msg while blocked."
+                             " Ignoring it",
+                             SRCNAME, __func__);
+                }
               break;
             }
           case (INVALIDATE_LAST_MAIL):
@@ -421,14 +431,12 @@ create_message_hook()
                            GetCurrentThreadId());
 }
 
-gpgrt_lock_t invalidate_lock = GPGRT_LOCK_INITIALIZER;
+GPGRT_LOCK_DEFINE (invalidate_lock);
 
 static bool invalidation_in_progress;
 
-static int invalidation_blocked = 0;
-
 DWORD WINAPI
-delayed_invalidate_ui (LPVOID)
+delayed_invalidate_ui (LPVOID minsleep)
 {
   if (invalidation_in_progress)
     {
@@ -440,6 +448,7 @@ delayed_invalidate_ui (LPVOID)
   invalidation_in_progress = true;
   gpgrt_lock_lock(&invalidate_lock);
 
+  Sleep((int) minsleep);
   int i = 0;
   while (invalidation_blocked)
     {
diff --git a/src/windowmessages.h b/src/windowmessages.h
index 29364a0..175bb52 100644
--- a/src/windowmessages.h
+++ b/src/windowmessages.h
@@ -102,12 +102,9 @@ void blockInv ();
 void unblockInv ();
 
 DWORD WINAPI
-delayed_invalidate_ui (LPVOID);
+delayed_invalidate_ui (LPVOID minsleep_ms = 0);
 
 DWORD WINAPI
 close_mail (LPVOID);
 
-/* The lock to invalide the ui */
-extern gpgrt_lock_t invalidate_lock;
-
 #endif // WINDOWMESSAGES_H

commit b881eebb0d89e7ce000b01a96c35d137ba558509
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Mon Jul 23 08:12:16 2018 +0200

    Trace return of UI callbacks
    
    * src/ribbon-callbacks.cpp: Trace returns.
    
    --
    These functions are often times the last functions in the
    log of a crash as they are called whenever the UI changed.
    There is no crash in them but to better see it anway we
    log when they are done.

diff --git a/src/ribbon-callbacks.cpp b/src/ribbon-callbacks.cpp
index 9ba0796..42a020e 100644
--- a/src/ribbon-callbacks.cpp
+++ b/src/ribbon-callbacks.cpp
@@ -537,6 +537,7 @@ HRESULT get_is_details_enabled (LPDISPATCH ctrl, VARIANT *result)
   result->pboolVal = (VARIANT_BOOL*) xmalloc (sizeof (VARIANT_BOOL));
   *(result->pboolVal) = none_selected ? VARIANT_FALSE : VARIANT_TRUE;
 
+  TRACEPOINT;
   return S_OK;
 }
 
@@ -558,6 +559,7 @@ HRESULT get_sig_label (LPDISPATCH ctrl, VARIANT *result)
   w_result = utf8_to_wchar (mail->getCryptoSummary ().c_str ());
   result->bstrVal = SysAllocString (w_result);
   xfree (w_result);
+  TRACEPOINT;
   return S_OK;
 }
 
@@ -581,6 +583,7 @@ HRESULT get_sig_ttip (LPDISPATCH ctrl, VARIANT *result)
     }
   result->bstrVal = SysAllocString (w_result);
   xfree (w_result);
+  TRACEPOINT;
   return S_OK;
 }
 
@@ -592,6 +595,7 @@ HRESULT get_sig_stip (LPDISPATCH ctrl, VARIANT *result)
   if (none_selected)
     {
       result->bstrVal = SysAllocString (L"");
+      TRACEPOINT;
       return S_OK;
     }
   if (!mail || !mail->isCryptoMail ())
@@ -602,12 +606,14 @@ HRESULT get_sig_stip (LPDISPATCH ctrl, VARIANT *result)
                                   "Click here to learn more."));
       result->bstrVal = SysAllocString (w_result);
       xfree (w_result);
+      TRACEPOINT;
       return S_OK;
     }
   const auto message = mail->getCryptoDetails_o ();
   wchar_t *w_message = utf8_to_wchar (message.c_str());
   result->bstrVal = SysAllocString (w_message);
   xfree (w_message);
+  TRACEPOINT;
   return S_OK;
 }
 
@@ -712,8 +718,10 @@ HRESULT get_crypto_icon (LPDISPATCH ctrl, VARIANT *result)
 
   if (mail)
     {
+      TRACEPOINT;
       return getIcon (mail->getCryptoIconID (), result);
     }
+  TRACEPOINT;
   return getIcon (IDI_LEVEL_0, result);
 }
 
@@ -726,6 +734,7 @@ HRESULT get_is_crypto_mail (LPDISPATCH ctrl, VARIANT *result)
   *(result->pboolVal) = (mail && (mail->isSigned () || mail->isEncrypted ())) ?
                           VARIANT_TRUE : VARIANT_FALSE;
 
+  TRACEPOINT;
   return S_OK;
 }
 

commit 1020ddceb349e508cadcae8155708bd3d5937aa9
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Mon Jul 23 08:09:26 2018 +0200

    Fix invalidate UI only on unselect
    
    * src/explorer-events.cpp (start_watchdog): Only invalidate
    UI on unselect.

diff --git a/src/explorer-events.cpp b/src/explorer-events.cpp
index d4087d1..e9dd776 100644
--- a/src/explorer-events.cpp
+++ b/src/explorer-events.cpp
@@ -148,10 +148,12 @@ start_watchdog (LPVOID arg)
       log_debug ("%s:%s: Deteced unselect invalidating UI.",
                  SRCNAME, __func__);
       it->second = UnselectSeen;
+      gpgrt_lock_unlock (&explorer_map_lock);
+      do_in_ui_thread (INVALIDATE_UI, nullptr);
+      return 0;
     }
   gpgrt_lock_unlock (&explorer_map_lock);
 
-  do_in_ui_thread (INVALIDATE_UI, nullptr);
   return 0;
 }
 

commit dff52c1a96c4b28ee2c5f66493d19507dacda5ca
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Mon Jul 23 08:08:06 2018 +0200

    unique_ptr++
    
    * src/parsecontroller.cpp (ParseController::get_ultimate_keys): Use
    unique ptr for context.

diff --git a/src/parsecontroller.cpp b/src/parsecontroller.cpp
index 1b19aba..9dfcc23 100644
--- a/src/parsecontroller.cpp
+++ b/src/parsecontroller.cpp
@@ -576,7 +576,7 @@ ParseController::get_ultimate_keys()
     }
   log_debug ("%s:%s: Starting keylisting.",
              SRCNAME, __func__);
-  auto ctx = Context::createForProtocol (OpenPGP);
+  auto ctx = std::unique_ptr<Context> (Context::createForProtocol (OpenPGP));
   if (!ctx)
     {
       /* Maybe PGP broken and not S/MIME */
@@ -592,7 +592,6 @@ ParseController::get_ultimate_keys()
     {
       log_error ("%s:%s: Failed to start keylisting err: %i: %s",
                  SRCNAME, __func__, err.code (), err.asString());
-      delete ctx;
       gpgrt_lock_unlock (&keylist_lock);
       return s_ultimate_keys;
     }
@@ -626,7 +625,6 @@ ParseController::get_ultimate_keys()
         }
     }
   TRACEPOINT;
-  delete ctx;
   log_debug ("%s:%s: keylisting done.",
              SRCNAME, __func__);
 

commit 9dfe1f112bc5da8d5b2240547c8fcc2751ff895b
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Fri Jul 20 15:52:52 2018 +0200

    Fix make dist
    
    * po/POTFILES.in: Update file list.

diff --git a/po/POTFILES.in b/po/POTFILES.in
index 9bb7716..39e66c3 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,7 +1,6 @@
 src/addin-options.cpp
-src/common.c
+src/common.cpp
 src/common.h
-src/config-dialog.c
 src/eventsink.h
 src/gpgoladdin.cpp
 src/gpgoladdin.h

commit 945d6a7dd8841c40bfe5986baa4a0d65c26f9c6b
Author: Andre Heinecke <aheinecke at intevation.de>
Date:   Fri Jul 20 15:52:09 2018 +0200

    Next version will be 2.3.0
    
    * configure.ac: Bump minor version.
    
    --
    Lots of traumatic changes.

diff --git a/configure.ac b/configure.ac
index b4f92ee..05de361 100644
--- a/configure.ac
+++ b/configure.ac
@@ -17,7 +17,7 @@ min_automake_version="1.14"
 # (git tag -s gpgol-k.n.m) and run "./autogen.sh --force".  Please
 # bump the version number immediately *after* the release and do
 # another commit and push so that the git magic is able to work.
-m4_define([mym4_version], [2.2.1])
+m4_define([mym4_version], [2.3.0])
 
 # Below is m4 magic to extract and compute the git revision number,
 # the decimalized short revision number, a beta version string and a

-----------------------------------------------------------------------

Summary of changes:
 configure.ac             |  2 +-
 po/POTFILES.in           |  3 +--
 src/common.cpp           | 20 +++++++-------
 src/common_indep.c       | 23 +++++++++++-----
 src/common_indep.h       |  1 +
 src/cpphelp.cpp          |  6 +++--
 src/explorer-events.cpp  |  4 ++-
 src/filetype.c           |  9 ++++---
 src/gpgoladdin.cpp       |  1 +
 src/mail.cpp             | 26 ++++++++++--------
 src/mailitem-events.cpp  |  3 ++-
 src/main.c               | 47 ++++++++-------------------------
 src/mapihelp.cpp         |  4 +--
 src/memdbg.cpp           | 69 +++++++++++++++++++++++++++++++++++++++++++++++-
 src/memdbg.h             |  5 ++++
 src/mimedataprovider.cpp |  2 +-
 src/mimemaker.cpp        | 10 +++----
 src/mlang-charset.cpp    |  4 +--
 src/oomhelp.cpp          |  4 +--
 src/parsecontroller.cpp  |  6 ++---
 src/pgpmime.c            |  2 +-
 src/revert.cpp           |  1 +
 src/rfc2047parse.c       |  6 ++---
 src/rfc822parse.c        | 31 +++++++++++-----------
 src/ribbon-callbacks.cpp |  9 +++++++
 src/vasprintf.c          |  2 +-
 src/w32-gettext.cpp      | 59 +++++++++++++++++++++--------------------
 src/windowmessages.cpp   | 29 +++++++++++++-------
 src/windowmessages.h     |  5 +---
 src/wks-helper.cpp       |  5 ++--
 src/xmalloc.h            | 61 +++++++++++++++++++++++++++++++++++++-----
 31 files changed, 299 insertions(+), 160 deletions(-)


hooks/post-receive
-- 
GnuPG extension for MS Outlook
http://git.gnupg.org




More information about the Gnupg-commits mailing list