]> granicus.if.org Git - neomutt/commitdiff
Fix several alias hashtable issues.
authorKevin McCarthy <kevin@8t8.us>
Wed, 18 Jan 2017 00:09:16 +0000 (16:09 -0800)
committerRichard Russon <rich@flatcap.org>
Fri, 10 Feb 2017 03:32:55 +0000 (03:32 +0000)
Convert to use the strdup keys hash.  Addresses can be converted back
and forth from intl to local forms.  This frees and recreates a new
addr->mailbox string, resulting in the hash table key being a dangling
pointer.

Change alias hash table insert/remove to ensure the address is in intl
form.  The alias menu (previously) converted address entries to local
form when performing a completion.  Even with the pointer issue fixed,
the entries may not be removed from the hash if the intl and local
forms are different.

Lastly, there is no reason for the alias menu to manually convert to
local form before writing the address to the output buffer.
rfc822_write_address() has a display parameter that will call
mutt_addr_for_display() instead when set.  Change to set the display
parameter and remove the conversion calls.

This last change obviates the first two changes, but they are a good idea
in any case.

addrbook.c
alias.c
init.c

index 132bd35f3b3055f0c7e678cff241cc23f0a5bd25..07eb9c69d05808a8fc557e35bc8acf947a6c629a 100644 (file)
@@ -227,16 +227,14 @@ new_aliases:
   {
     if (AliasTable[i]->tagged)
     {
-      mutt_addrlist_to_local (AliasTable[i]->addr);
-      rfc822_write_address (buf, buflen, AliasTable[i]->addr, 0);
+      rfc822_write_address (buf, buflen, AliasTable[i]->addr, 1);
       t = -1;
     }
   }
 
-  if(t != -1)
+  if (t != -1)
   {
-      mutt_addrlist_to_local (AliasTable[t]->addr);
-    rfc822_write_address (buf, buflen, AliasTable[t]->addr, 0);
+    rfc822_write_address (buf, buflen, AliasTable[t]->addr, 1);
   }
 
   mutt_menuDestroy (&menu);
diff --git a/alias.c b/alias.c
index 4d022168097220e58155f0c1b04d27a2172488f6..c7806537f038d3ce37142087d78ee60769c81235 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -460,7 +460,12 @@ void mutt_alias_add_reverse (ALIAS *t)
   ADDRESS *ap;
   if (!t)
     return;
-  
+
+  /* Note that the address mailbox should be converted to intl form
+   * before using as a key in the hash.  This is currently done
+   * by all callers, but added here mostly as documentation.. */
+  mutt_addrlist_to_intl (t->addr, NULL);
+
   for (ap = t->addr; ap; ap = ap->next)
   {
     if (!ap->group && ap->mailbox)
@@ -473,7 +478,11 @@ void mutt_alias_delete_reverse (ALIAS *t)
   ADDRESS *ap;
   if (!t)
     return;
-  
+
+  /* If the alias addresses were converted to local form, they won't
+   * match the hash entries. */
+  mutt_addrlist_to_intl (t->addr, NULL);
+
   for (ap = t->addr; ap; ap = ap->next)
   {
     if (!ap->group && ap->mailbox)
diff --git a/init.c b/init.c
index 0448c952b002af8d6981095dcf7cb694a5ea4eb8..30f0cb54b715a85b1efa1e6e4563af6f98adcea3 100644 (file)
--- a/init.c
+++ b/init.c
@@ -3554,7 +3554,8 @@ void mutt_init (int skip_sys_rc, LIST *commands)
   err.dptr = err.data;
 
   Groups = hash_create (1031, 0);
-  ReverseAlias = hash_create (1031, MUTT_HASH_STRCASECMP);
+  /* reverse alias keys need to be strdup'ed because of idna conversions */
+  ReverseAlias = hash_create (1031, MUTT_HASH_STRCASECMP | MUTT_HASH_STRDUP_KEYS);
 #ifdef USE_NOTMUCH
   TagTransforms = hash_create (64, 1);
   TagFormats = hash_create (64, 0);