changeset: 6532:94186a96ca17
user: Kevin McCarthy <[email protected]>
date: Tue Nov 24 21:45:58 2015 -0800
link: http://dev.mutt.org/hg/mutt/rev/94186a96ca17
Fix bad idn error on local mailboxes. (closes #3795)
Commit 831abf39d53a pulled the mbox_to_udomain() call inside the
conversion functions. Unfortunately, this causes local (user only)
mailboxes to be considered conversion errors instead of just skipping
them.
Revert mbox_to_udomain() back to using a static buffer and pull back
into the mutt_addrlist_to_local/intl() functions.
Pass the user and domain into the conversion functions instead of the address.
diffs (227 lines):
diff -r 0d7ce56bbafd -r 94186a96ca17 mutt_idna.c
--- a/mutt_idna.c Tue Nov 24 15:49:31 2015 -0800
+++ b/mutt_idna.c Tue Nov 24 21:45:58 2015 -0800
@@ -45,21 +45,17 @@
static int mbox_to_udomain (const char *mbx, char **user, char **domain)
{
- char *buff = NULL;
+ static char *buff = NULL;
char *p;
- buff = safe_strdup (mbx);
+ mutt_str_replace (&buff, mbx);
+
p = strchr (buff, '@');
if (!p || !p[1])
- {
- FREE (&buff);
return -1;
- }
-
*p = '\0';
- *user = safe_strdup (buff);
- *domain = safe_strdup (p + 1);
- FREE (&buff);
+ *user = buff;
+ *domain = p + 1;
return 0;
}
@@ -89,37 +85,34 @@
a->is_intl = 1;
}
-static char *intl_to_local (ADDRESS *a, int flags)
+static char *intl_to_local (char *orig_user, char *orig_domain, int flags)
{
- char *user = NULL, *domain = NULL, *mailbox = NULL;
- char *orig_user = NULL, *reversed_user = NULL;
- char *orig_domain = NULL, *reversed_domain = NULL;
+ char *local_user = NULL, *local_domain = NULL, *mailbox = NULL;
+ char *reversed_user = NULL, *reversed_domain = NULL;
char *tmp = NULL;
#ifdef HAVE_LIBIDN
int is_idn_encoded = 0;
#endif /* HAVE_LIBIDN */
- if (mbox_to_udomain (a->mailbox, &user, &domain) == -1)
- goto cleanup;
- orig_user = safe_strdup (user);
- orig_domain = safe_strdup (domain);
+ local_user = safe_strdup (orig_user);
+ local_domain = safe_strdup (orig_domain);
#ifdef HAVE_LIBIDN
- is_idn_encoded = check_idn (domain);
+ is_idn_encoded = check_idn (local_domain);
if (is_idn_encoded && option (OPTIDNDECODE))
{
- if (idna_to_unicode_8z8z (domain, &tmp, IDNA_ALLOW_UNASSIGNED) !=
IDNA_SUCCESS)
+ if (idna_to_unicode_8z8z (local_domain, &tmp, IDNA_ALLOW_UNASSIGNED) !=
IDNA_SUCCESS)
goto cleanup;
- mutt_str_replace (&domain, tmp);
+ mutt_str_replace (&local_domain, tmp);
FREE (&tmp);
}
#endif /* HAVE_LIBIDN */
/* we don't want charset-hook effects, so we set flags to 0 */
- if (mutt_convert_string (&user, "utf-8", Charset, 0) == -1)
+ if (mutt_convert_string (&local_user, "utf-8", Charset, 0) == -1)
goto cleanup;
- if (mutt_convert_string (&domain, "utf-8", Charset, 0) == -1)
+ if (mutt_convert_string (&local_domain, "utf-8", Charset, 0) == -1)
goto cleanup;
/*
@@ -128,7 +121,7 @@
*/
if ((flags & MI_MAY_BE_IRREVERSIBLE) == 0)
{
- reversed_user = safe_strdup (user);
+ reversed_user = safe_strdup (local_user);
if (mutt_convert_string (&reversed_user, Charset, "utf-8", 0) == -1)
{
@@ -145,7 +138,7 @@
goto cleanup;
}
- reversed_domain = safe_strdup (domain);
+ reversed_domain = safe_strdup (local_domain);
if (mutt_convert_string (&reversed_domain, Charset, "utf-8", 0) == -1)
{
@@ -181,51 +174,50 @@
}
}
- mailbox = safe_malloc (mutt_strlen (user) + mutt_strlen (domain) + 2);
- sprintf (mailbox, "%s@%s", NONULL(user), NONULL(domain)); /*
__SPRINTF_CHECKED__ */
+ mailbox = safe_malloc (mutt_strlen (local_user) + mutt_strlen (local_domain)
+ 2);
+ sprintf (mailbox, "%s@%s", NONULL(local_user), NONULL(local_domain)); /*
__SPRINTF_CHECKED__ */
cleanup:
- FREE (&user);
- FREE (&domain);
+ FREE (&local_user);
+ FREE (&local_domain);
FREE (&tmp);
- FREE (&orig_domain);
FREE (&reversed_domain);
- FREE (&orig_user);
FREE (&reversed_user);
return mailbox;
}
-static char *local_to_intl (ADDRESS *a)
+static char *local_to_intl (char *user, char *domain)
{
- char *user = NULL, *domain = NULL, *mailbox = NULL;
+ char *intl_user = NULL, *intl_domain = NULL;
+ char *mailbox = NULL;
char *tmp = NULL;
- if (mbox_to_udomain (a->mailbox, &user, &domain) == -1)
+ intl_user = safe_strdup (user);
+ intl_domain = safe_strdup (domain);
+
+ /* we don't want charset-hook effects, so we set flags to 0 */
+ if (mutt_convert_string (&intl_user, Charset, "utf-8", 0) == -1)
goto cleanup;
- /* we don't want charset-hook effects, so we set flags to 0 */
- if (mutt_convert_string (&user, Charset, "utf-8", 0) == -1)
- goto cleanup;
-
- if (mutt_convert_string (&domain, Charset, "utf-8", 0) == -1)
+ if (mutt_convert_string (&intl_domain, Charset, "utf-8", 0) == -1)
goto cleanup;
#ifdef HAVE_LIBIDN
if (option (OPTIDNENCODE))
{
- if (idna_to_ascii_8z (domain, &tmp, IDNA_ALLOW_UNASSIGNED) != IDNA_SUCCESS)
+ if (idna_to_ascii_8z (intl_domain, &tmp, IDNA_ALLOW_UNASSIGNED) !=
IDNA_SUCCESS)
goto cleanup;
- mutt_str_replace (&domain, tmp);
+ mutt_str_replace (&intl_domain, tmp);
}
#endif /* HAVE_LIBIDN */
- mailbox = safe_malloc (mutt_strlen (user) + mutt_strlen (domain) + 2);
- sprintf (mailbox, "%s@%s", NONULL(user), NONULL(domain)); /*
__SPRINTF_CHECKED__ */
+ mailbox = safe_malloc (mutt_strlen (intl_user) + mutt_strlen (intl_domain) +
2);
+ sprintf (mailbox, "%s@%s", NONULL(intl_user), NONULL(intl_domain)); /*
__SPRINTF_CHECKED__ */
cleanup:
- FREE (&user);
- FREE (&domain);
+ FREE (&intl_user);
+ FREE (&intl_domain);
FREE (&tmp);
return mailbox;
@@ -235,6 +227,7 @@
int mutt_addrlist_to_intl (ADDRESS *a, char **err)
{
+ char *user = NULL, *domain = NULL;
char *intl_mailbox = NULL;
int rv = 0;
@@ -246,7 +239,10 @@
if (!a->mailbox || addr_is_intl (a))
continue;
- intl_mailbox = local_to_intl (a);
+ if (mbox_to_udomain (a->mailbox, &user, &domain) == -1)
+ continue;
+
+ intl_mailbox = local_to_intl (user, domain);
if (! intl_mailbox)
{
rv = -1;
@@ -263,6 +259,7 @@
int mutt_addrlist_to_local (ADDRESS *a)
{
+ char *user = NULL, *domain = NULL;
char *local_mailbox = NULL;
for (; a; a = a->next)
@@ -270,7 +267,10 @@
if (!a->mailbox || addr_is_local (a))
continue;
- local_mailbox = intl_to_local (a, 0);
+ if (mbox_to_udomain (a->mailbox, &user, &domain) == -1)
+ continue;
+
+ local_mailbox = intl_to_local (user, domain, 0);
if (local_mailbox)
set_local_mailbox (a, local_mailbox);
}
@@ -281,6 +281,7 @@
/* convert just for displaying purposes */
const char *mutt_addr_for_display (ADDRESS *a)
{
+ char *user = NULL, *domain = NULL;
static char *buff = NULL;
char *local_mailbox = NULL;
@@ -289,7 +290,10 @@
if (!a->mailbox || addr_is_local (a))
return a->mailbox;
- local_mailbox = intl_to_local (a, MI_MAY_BE_IRREVERSIBLE);
+ if (mbox_to_udomain (a->mailbox, &user, &domain) == -1)
+ return a->mailbox;
+
+ local_mailbox = intl_to_local (user, domain, MI_MAY_BE_IRREVERSIBLE);
if (! local_mailbox)
return a->mailbox;