Fix blind list alias expansion
authorDavid Levine <levinedl@acm.org>
Mon, 15 Oct 2012 00:27:17 +0000 (19:27 -0500)
committerPhilipp Takacs <philipp@bureaucracy.de>
Sun, 18 Nov 2018 21:15:18 +0000 (22:15 +0100)
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].

man/mh-alias.man5
uip/aliasbr.c

index 1d0508f..3769141 100644 (file)
@@ -135,7 +135,7 @@ Example Alias File:
 .nf
 <%etcdir%/MoreAliases
 sgroup: fred, fear, freida
 .nf
 <%etcdir%/MoreAliases
 sgroup: fred, fear, freida
-b-people: Blind List: bill, betty;
+b-people: Blind List: bill, betty
 fred: frated@UCI
 UNIX\-committee: <unix.aliases
 staff: =staff
 fred: frated@UCI
 UNIX\-committee: <unix.aliases
 staff: =staff
@@ -218,6 +218,13 @@ Start adding aliases to your
 .RI ` aliases '
 file as appropriate.
 .RE
 .RI ` aliases '
 file as appropriate.
 .RE
+.PP
+Earlier versions of this man page showed a semicolon at the end of the
+blind list example.  That caused the preceeding alias to not be
+expanded.  There must not be a semicolon at the end of, or within, the
+address group of a blind list.
+.B post
+will append the semicolon to the blind list name.
 
 .SH FILES
 None
 
 .SH FILES
 None
@@ -249,5 +256,3 @@ command may defeat this.
 Since the number of file descriptors is finite (and very limited), such
 infinite recursion will terminate with a meaningless diagnostic when
 all the fds are used up.
 Since the number of file descriptors is finite (and very limited), such
 infinite recursion will terminate with a meaningless diagnostic when
 all the fds are used up.
-.PP
-Forward references do not work correctly inside blind lists.
index b00f51b..3faa373 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <h/mh.h>
 #include <h/aliasbr.h>
 
 #include <h/mh.h>
 #include <h/aliasbr.h>
+#include <h/addrsbr.h>
 #include <h/utils.h>
 #include <grp.h>
 #include <pwd.h>
 #include <h/utils.h>
 #include <grp.h>
 #include <pwd.h>
@@ -99,9 +100,47 @@ akval(struct aka *ak, char *s)
        if (!s)
                return s;  /* XXX */
 
        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);
 }
 
        return mh_xstrdup(s);
 }