Changeset 5375:132474d6dd3b for alias.c

Show
Ignore:
Timestamp:
2008-05-15 08:29:04 (6 months ago)
Author:
Rocco Rutte <pdmef@…>
Branch:
HEAD
Message:

Make mutt_check_alias_name() multibyte-aware (closes #2403).

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • alias.c

    r5373 r5375  
    215215{ 
    216216  ALIAS *new, *t; 
    217   char buf[LONG_STRING], prompt[SHORT_STRING], *pc; 
     217  char buf[LONG_STRING], tmp[LONG_STRING], prompt[SHORT_STRING], *pc; 
    218218  char *err = NULL; 
    219219  char fixed[LONG_STRING]; 
     
    232232  if (adr && adr->mailbox) 
    233233  { 
    234     strfcpy (buf, adr->mailbox, sizeof (buf)); 
    235     if ((pc = strchr (buf, '@'))) 
     234    strfcpy (tmp, adr->mailbox, sizeof (tmp)); 
     235    if ((pc = strchr (tmp, '@'))) 
    236236      *pc = 0; 
    237237  } 
    238238  else 
    239     buf[0] = '\0'; 
     239    tmp[0] = '\0'; 
    240240 
    241241  /* Don't suggest a bad alias name in the event of a strange local part. */ 
    242   mutt_check_alias_name (buf, buf); 
     242  mutt_check_alias_name (tmp, buf, sizeof (buf)); 
    243243   
    244244retry_name: 
     
    254254  } 
    255255   
    256   if (mutt_check_alias_name (buf, fixed)) 
     256  if (mutt_check_alias_name (buf, fixed, sizeof (fixed))) 
    257257  { 
    258258    switch (mutt_yesorno (_("Warning: This alias name may not work.  Fix it?"), M_YES)) 
     
    352352    } 
    353353 
    354     if (mutt_check_alias_name (new->name, NULL)) 
     354    if (mutt_check_alias_name (new->name, NULL, 0)) 
    355355      mutt_quote_filename (buf, sizeof (buf), new->name); 
    356356    else 
     
    380380 */ 
    381381 
    382 static int check_alias_name_char (char c) 
    383 { 
    384   return (c == '-' || c == '_' || c == '+' || c == '=' || c == '.' || 
    385           isalnum ((unsigned char) c)); 
    386 } 
    387  
    388 int mutt_check_alias_name (const char *s, char *d) 
    389 { 
    390   int rv = 0; 
    391   for (; *s; s++)  
    392   { 
    393     if (!check_alias_name_char (*s)) 
    394     { 
    395       if (!d) 
     382int mutt_check_alias_name (const char *s, char *dest, size_t destlen) 
     383{ 
     384  wchar_t wc; 
     385  mbstate_t mb; 
     386  size_t l; 
     387  int rv = 0, bad = 0, dry = !dest || !destlen; 
     388 
     389  memset (&mb, 0, sizeof (mbstate_t)); 
     390 
     391  if (!dry) 
     392    destlen--; 
     393  for (; s && *s && (dry || destlen) && 
     394       (l = mbrtowc (&wc, s, MB_CUR_MAX, &mb)) != 0; 
     395       s += l, destlen -= l) 
     396  { 
     397    bad = l == (size_t)(-1) || l == (size_t)(-2); /* conversion error */ 
     398    bad = bad || (!dry && l > destlen);         /* too few room for mb char */ 
     399    if (l == 1) 
     400      bad = bad || (strchr ("-_+=.", *s) == NULL && !iswalnum (wc)); 
     401    else 
     402      bad = bad || !iswalnum (wc); 
     403    if (bad) 
     404    { 
     405      if (dry) 
    396406        return -1; 
    397       else 
    398       { 
    399         *d++ = '_'; 
    400         rv = -1; 
    401       } 
    402     } 
    403     else if (d) 
    404       *d++ = *s; 
    405   } 
    406   if (d) 
    407     *d++ = *s; 
     407      *dest++ = '_'; 
     408      rv = -1; 
     409    } 
     410    else if (!dry) 
     411    { 
     412      memcpy (dest, s, l); 
     413      dest += l; 
     414    } 
     415  } 
     416  if (!dry) 
     417    *dest = 0; 
    408418  return rv; 
    409419}