]> granicus.if.org Git - neomutt/commitdiff
Make mutt_check_alias_name() multibyte-aware (closes #2403).
authorRocco Rutte <pdmef@gmx.net>
Thu, 15 May 2008 15:29:04 +0000 (17:29 +0200)
committerRocco Rutte <pdmef@gmx.net>
Thu, 15 May 2008 15:29:04 +0000 (17:29 +0200)
ChangeLog
alias.c
protos.h

index 94b28cd8fe504d532d1e6e76b03dabdc83d1aa52..0d9c47dacc3115b463ffb78373c548b59e71b14d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-05-15 16:01 +0200  Rocco Rutte  <pdmef@gmx.net>  (9a229c41e980)
+
+       * doc/manual.xml.head: Document exact address in the manual (closes
+       #3050)
+
+2008-05-14 16:23 -0700  Brendan Cully  <brendan@kublai.com>  (7f4711b9b61f)
+
+       * ChangeLog, alias.c: Ensure alias file ends with \n before appending
+       new aliases. Closes #1580.
+
 2008-05-14 15:19 +0200  Samuel Tardieu  <sam@rfc1149.net>  (5518355bc6da)
 
        * curs_main.c: Always update status bar after sorting method changes
diff --git a/alias.c b/alias.c
index e8696cdba3116b40104ed5aba0a0fce9f4897ac0..50ec5a310a5bc4cef602774fa957bcadc261875c 100644 (file)
--- a/alias.c
+++ b/alias.c
@@ -214,7 +214,7 @@ ADDRESS *mutt_get_address (ENVELOPE *env, char **pfxp)
 void mutt_create_alias (ENVELOPE *cur, ADDRESS *iadr)
 {
   ALIAS *new, *t;
-  char buf[LONG_STRING], prompt[SHORT_STRING], *pc;
+  char buf[LONG_STRING], tmp[LONG_STRING], prompt[SHORT_STRING], *pc;
   char *err = NULL;
   char fixed[LONG_STRING];
   FILE *rc;
@@ -231,15 +231,15 @@ void mutt_create_alias (ENVELOPE *cur, ADDRESS *iadr)
 
   if (adr && adr->mailbox)
   {
-    strfcpy (buf, adr->mailbox, sizeof (buf));
-    if ((pc = strchr (buf, '@')))
+    strfcpy (tmp, adr->mailbox, sizeof (tmp));
+    if ((pc = strchr (tmp, '@')))
       *pc = 0;
   }
   else
-    buf[0] = '\0';
+    tmp[0] = '\0';
 
   /* Don't suggest a bad alias name in the event of a strange local part. */
-  mutt_check_alias_name (buf, buf);
+  mutt_check_alias_name (tmp, buf, sizeof (buf));
   
 retry_name:
   /* add a new alias */
@@ -253,7 +253,7 @@ retry_name:
     return;
   }
   
-  if (mutt_check_alias_name (buf, fixed))
+  if (mutt_check_alias_name (buf, fixed, sizeof (fixed)))
   {
     switch (mutt_yesorno (_("Warning: This alias name may not work.  Fix it?"), M_YES))
     {
@@ -351,7 +351,7 @@ retry_name:
        fputc ('\n', rc);
     }
 
-    if (mutt_check_alias_name (new->name, NULL))
+    if (mutt_check_alias_name (new->name, NULL, 0))
       mutt_quote_filename (buf, sizeof (buf), new->name);
     else
       strfcpy (buf, new->name, sizeof (buf));
@@ -379,32 +379,42 @@ retry_name:
  * the RFC 822 and the mutt configuration parser are permitted.
  */
 
-static int check_alias_name_char (char c)
+int mutt_check_alias_name (const char *s, char *dest, size_t destlen)
 {
-  return (c == '-' || c == '_' || c == '+' || c == '=' || c == '.' ||
-         isalnum ((unsigned char) c));
-}
-
-int mutt_check_alias_name (const char *s, char *d)
-{
-  int rv = 0;
-  for (; *s; s++) 
+  wchar_t wc;
+  mbstate_t mb;
+  size_t l;
+  int rv = 0, bad = 0, dry = !dest || !destlen;
+
+  memset (&mb, 0, sizeof (mbstate_t));
+
+  if (!dry)
+    destlen--;
+  for (; s && *s && (dry || destlen) &&
+       (l = mbrtowc (&wc, s, MB_CUR_MAX, &mb)) != 0;
+       s += l, destlen -= l)
   {
-    if (!check_alias_name_char (*s))
+    bad = l == (size_t)(-1) || l == (size_t)(-2); /* conversion error */
+    bad = bad || (!dry && l > destlen);                /* too few room for mb char */
+    if (l == 1)
+      bad = bad || (strchr ("-_+=.", *s) == NULL && !iswalnum (wc));
+    else
+      bad = bad || !iswalnum (wc);
+    if (bad)
     {
-      if (!d)
+      if (dry)
        return -1;
-      else
-      {
-       *d++ = '_';
-       rv = -1;
-      }
+      *dest++ = '_';
+      rv = -1;
+    }
+    else if (!dry)
+    {
+      memcpy (dest, s, l);
+      dest += l;
     }
-    else if (d)
-      *d++ = *s;
   }
-  if (d)
-    *d++ = *s;
+  if (!dry)
+    *dest = 0;
   return rv;
 }
 
index 2a67bde03baa94290fa74a369025f24eede51ed8..7109995362d1ac38ab354ab83bedcd0c42c5c392 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -272,7 +272,7 @@ int mutt_buffy_notify (void);
 int mutt_builtin_editor (const char *, HEADER *, HEADER *);
 int mutt_can_decode (BODY *);
 int mutt_change_flag (HEADER *, int);
-int mutt_check_alias_name (const char *, char *);
+int mutt_check_alias_name (const char *, char *, size_t);
 int mutt_check_encoding (const char *);
 int mutt_check_key (const char *);
 int mutt_check_menu (const char *);