From: David Levine Date: Mon, 15 Oct 2012 00:27:17 +0000 (-0500) Subject: Fix blind list alias expansion X-Git-Tag: mmh-0.4~18 X-Git-Url: http://git.marmaro.de/?p=mmh;a=commitdiff_plain;h=1c4473f16f0081a480b9c1065675fdee277618f5 Fix blind list alias expansion The first alias contained in a blind list is now expanded. The mh-alias(5) man page was updated to show that blind lists must not be terminated with, or contain, a trailing semicolon [Bug #15604]. --- diff --git a/man/mh-alias.man5 b/man/mh-alias.man5 index 1d0508f..3769141 100644 --- a/man/mh-alias.man5 +++ b/man/mh-alias.man5 @@ -135,7 +135,7 @@ Example Alias File: .nf <%etcdir%/MoreAliases sgroup: fred, fear, freida -b-people: Blind List: bill, betty; +b-people: Blind List: bill, betty fred: frated@UCI UNIX\-committee: #include +#include #include #include #include @@ -99,9 +100,47 @@ akval(struct aka *ak, char *s) if (!s) return s; /* XXX */ - for (; ak; ak = ak->ak_next) - if (aleq(s, ak->ak_name)) - return akresult(ak); + for (; ak; ak = ak->ak_next) { + if (aleq (s, ak->ak_name)) { + return akresult (ak); + } else if (strchr (s, ':')) { + /* + ** The first address in a blind list will contain the + ** alias name, so try to match, but just with just the + ** address (not including the list name). If there's a + ** match, then replace the alias part with its + ** expansion. + */ + + char *name = getname(s); + char *cp = NULL; + + if (name) { + /* + ** s is of the form "Blind list: address". If address + ** is an alias, expand it. + */ + struct mailname *mp = getm(name, NULL, 0, AD_NAME, NULL); + + if (mp && mp->m_ingrp) { + char *gname = add (mp->m_gname, NULL); + + if (gname && aleq(name, ak->ak_name)) { + /* Will leak cp. */ + cp = concat (gname, akresult (ak), NULL); + free(gname); + } + } + mnfree(mp); + } + /* Need to flush getname after use. */ + while (getname("")) continue; + + if (cp) { + return cp; + } + } + } return mh_xstrdup(s); }