summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin McCarthy <kevin@8t8.us>2017-01-17 16:09:16 -0800
committerKevin McCarthy <kevin@8t8.us>2017-01-17 16:09:16 -0800
commit851b549dbf7202ead4e8345b9a936ee515ea4097 (patch)
treec3084b74e95e3944a78b32c449cbe0697adeb92e
parent58d04543821ff89c3c403af9b46d0383dd52ad63 (diff)
Fix several alias hashtable issues.
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.
-rw-r--r--addrbook.c8
-rw-r--r--alias.c13
-rw-r--r--init.c3
3 files changed, 16 insertions, 8 deletions
diff --git a/addrbook.c b/addrbook.c
index a1670e9a..a3088188 100644
--- a/addrbook.c
+++ b/addrbook.c
@@ -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 baeafb3b..d9b52fa8 100644
--- a/alias.c
+++ b/alias.c
@@ -456,7 +456,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)
@@ -469,7 +474,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 7f16d591..6534f69e 100644
--- a/init.c
+++ b/init.c
@@ -3158,7 +3158,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);
mutt_menu_init ();
mutt_srandom ();