diff -u ../zmailer-2.99.43/router/functions.c router/functions.c
--- ../zmailer-2.99.43/router/functions.c       Mon Nov 11 18:33:19 1996
+++ router/functions.c  Sat Dec 28 05:12:45 1996
@@ -91,7 +91,7 @@
extern void setfreefd();
extern void v_purge();

-extern char *newattribute_2 __((struct conscell *, char *, char*));
+extern char *newattribute_2 __((char *, char *, char*));

#ifndef strchr
extern char *strchr(), *strrchr();
@@ -1256,9 +1256,8 @@
       struct address *ap;
       struct token **pt, *t;
       struct addr *pp;
-       struct conscell *attributes, *tmp;
-       struct conscell *al, *alp = NULL;
-       char *localpart, *origaddr;
+       struct conscell *al, *alp = NULL, *tmp;
+       char *localpart, *origaddr, *attributenam;
       int c, n, len, errflag, stuff;
       volatile int cnt;
       char *comment, *erroraddress;
@@ -1327,7 +1326,8 @@
       tmp = il;
       for (; tmp != NULL; tmp = cdr(tmp)) ++cnt; /* Count arguments.. */

-       if (errflag || cnt != 3) {
+       if (errflag || cnt != 3 ||
+           !STRING(il) || !STRING(cdr(il)) || !STRING(cddr(il)) ) {
               fprintf(stderr,
                       "Usage: %s [ -e error-address ] [ -E errors-to-address ] [-p privilege] [ -c comment ] [ -N notarystring ] $attribute $localpart $origaddr < /file/path \n",
               car(avl)->string);
@@ -1337,11 +1337,9 @@
               return NULL;
       }

-       attributes = copycell(il);
-       car(attributes) = s_copy_tree(car(attributes));
-       cdr(attributes) = NULL;
-       localpart  = (char*) cdr(il)->string;
-       origaddr   = (char*) cddr(il)->string;
+       attributenam = (char*)    (il)->string;
+       localpart    = (char*) cdr(il)->string;
+       origaddr     = (char*) cddr(il)->string;

       /* We (memory-)leak this stuff for a moment.. */
       e = (struct envelope *)tmalloc(sizeof (struct envelope));
@@ -1485,6 +1483,7 @@
       for (ap = hs.h_contents.a; ap != NULL; ap = ap->a_next) {
               char *av[5];
               int rc;
+               int omem;
               struct conscell *l, *d, *lrc;
               char *s, *s2, *se;

@@ -1522,20 +1521,29 @@
                 ++s;
               }
               *s2 = 0;
-               s = newattribute_2(attributes,"DSN",DSNbuf);
+               s = newattribute_2(attributenam,"DSN",DSNbuf);
+
+               omem = stickymem;
+               /* stickymem = MEM_MALLOC; */

               l       = newstring((u_char*)strsave(buf));
-               cdr(l)  = conststring((u_char*)origaddr);
+               cdr(l)  = newstring((u_char*)strsave(origaddr));
               cddr(l) = newstring((u_char*)strsave(s));
               l = ncons(l);

+               stickymem = omem;
+
               deferit = 0;
               v_set(DEFER, "");

               rc = l_apply("rrouter", l);
               lrc = s_value;
               s_value = NULL;
-               s_free_tree(l); /* We can clean up the input list */
+
+               omem = stickymem;
+               /* stickymem = MEM_MALLOC;
+                  s_free_tree(l); */ /* We can clean up the input list */
+               stickymem = omem;
#else
               lrc = router(ap, privilege, "recipient");
               rc = (lrc == NULL);
diff -u ../zmailer-2.99.43/router/shliaise.c router/shliaise.c
--- ../zmailer-2.99.43/router/shliaise.c        Thu Oct 31 19:03:47 1996
+++ router/shliaise.c   Sat Dec 28 04:13:13 1996
@@ -357,16 +357,13 @@
/*
 *  newattribute_2()
 */
-char *newattribute_2(oattr,nam,val)
-struct conscell *oattr;
-char *nam, *val;
+char *newattribute_2(onam,nam,val)
+char *onam, *nam, *val;
{
       struct conscell *l, *lc, *tmp, **pl;
       struct conscell *l1;

-       if (!(LIST(oattr) && STRING(car(oattr))))
-         return NULL;
-       l1 = v_find(car(oattr)->string);
+       l1 = v_find(onam);
       if (!l1)
         return NULL;
       l = copycell(cdr(l1));