bug report from gumkowsk@nadc.arpa (fix is my own),
authorEdward Wang <edward@ucbvax.Berkeley.EDU>
Thu, 18 Aug 1988 05:44:46 +0000 (21:44 -0800)
committerEdward Wang <edward@ucbvax.Berkeley.EDU>
Thu, 18 Aug 1988 05:44:46 +0000 (21:44 -0800)
handle unmatched quotes correctly and make null string match no sender

SCCS-vsn: usr.bin/mail/def.h 5.18
SCCS-vsn: usr.bin/mail/list.c 5.10

usr/src/usr.bin/mail/def.h
usr/src/usr.bin/mail/list.c

index 6627ccc..65f6252 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)def.h       5.17 (Berkeley) %G%
+ *     @(#)def.h       5.18 (Berkeley) %G%
  */
 
 #include <sys/param.h>         /* includes <sys/types.h> */
  */
 
 #include <sys/param.h>         /* includes <sys/types.h> */
@@ -223,6 +223,7 @@ struct ignoretab {
 #define        TOPEN   8                       /* An '(' */
 #define        TCLOSE  9                       /* A ')' */
 #define TPLUS  10                      /* A '+' */
 #define        TOPEN   8                       /* An '(' */
 #define        TCLOSE  9                       /* A ')' */
 #define TPLUS  10                      /* A '+' */
+#define TERROR 11                      /* A lexical error */
 
 #define        REGDEP  2                       /* Maximum regret depth. */
 #define        STRINGLEN       1024            /* Maximum length of string token */
 
 #define        REGDEP  2                       /* Maximum regret depth. */
 #define        STRINGLEN       1024            /* Maximum length of string token */
index a67fbbd..a209ec9 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)list.c     5.9 (Berkeley) %G%";
+static char sccsid[] = "@(#)list.c     5.10 (Berkeley) %G%";
 #endif /* not lint */
 
 #include "rcv.h"
 #endif /* not lint */
 
 #include "rcv.h"
@@ -204,6 +204,9 @@ number:
                        }
                        star++;
                        break;
                        }
                        star++;
                        break;
+
+               case TERROR:
+                       return -1;
                }
                tok = scan(&bufp);
        }
                }
                tok = scan(&bufp);
        }
@@ -249,7 +252,7 @@ number:
                                        }
                                }
                                else {
                                        }
                                }
                                else {
-                                       if (sender(*np, i)) {
+                                       if (matchsender(*np, i)) {
                                                mc++;
                                                break;
                                        }
                                                mc++;
                                                break;
                                        }
@@ -541,16 +544,20 @@ scan(sp)
                c = *cp++;
        }
        while (c != '\0') {
                c = *cp++;
        }
        while (c != '\0') {
-               if (c == quotec)
+               if (c == quotec) {
+                       cp++;
                        break;
                        break;
+               }
                if (quotec == 0 && (c == ' ' || c == '\t'))
                        break;
                if (cp2 - lexstring < STRINGLEN-1)
                        *cp2++ = c;
                c = *cp++;
        }
                if (quotec == 0 && (c == ' ' || c == '\t'))
                        break;
                if (cp2 - lexstring < STRINGLEN-1)
                        *cp2++ = c;
                c = *cp++;
        }
-       if (quotec && c == 0)
+       if (quotec && c == 0) {
                fprintf(stderr, "Missing %c\n", quotec);
                fprintf(stderr, "Missing %c\n", quotec);
+               return TERROR;
+       }
        *sp = --cp;
        *cp2 = '\0';
        return(TSTRING);
        *sp = --cp;
        *cp2 = '\0';
        return(TSTRING);
@@ -611,14 +618,14 @@ first(f, m)
  * if so.
  */
 
  * if so.
  */
 
-sender(str, mesg)
+matchsender(str, mesg)
        char *str;
 {
        char *str;
 {
-       register struct message *mp;
        register char *cp, *cp2, *backup;
 
        register char *cp, *cp2, *backup;
 
-       mp = &message[mesg-1];
-       backup = cp2 = nameof(mp, 0);
+       if (!*str)      /* null string matches nothing instead of everything */
+               return 0;
+       backup = cp2 = nameof(&message[mesg - 1], 0);
        cp = str;
        while (*cp2) {
                if (*cp == 0)
        cp = str;
        while (*cp2) {
                if (*cp == 0)