Author: se
Date: Tue Nov  3 11:37:19 2020
New Revision: 367292
URL: https://svnweb.freebsd.org/changeset/base/367292

Log:
  Check that #ifdef, #ifndef, and #undef are used with a single name
  
  This restores the parameter validation that has been peformed by cpp
  for defining and testing of names used in conditions.
  
  MFC after:    3 days

Modified:
  head/usr.bin/calendar/io.c

Modified: head/usr.bin/calendar/io.c
==============================================================================
--- head/usr.bin/calendar/io.c  Tue Nov  3 10:02:52 2020        (r367291)
+++ head/usr.bin/calendar/io.c  Tue Nov  3 11:37:19 2020        (r367292)
@@ -89,22 +89,29 @@ static StringList *definitions = NULL;
 static struct event *events[MAXCOUNT];
 static char *extradata[MAXCOUNT];
 
-static void
+static char *
 trimlr(char **buf)
 {
        char *walk = *buf;
+       char *sep;
        char *last;
 
        while (isspace(*walk))
                walk++;
-       if (*walk != '\0') {
-               last = walk + strlen(walk) - 1;
+       *buf = walk;
+
+       sep = walk;
+       while (*sep != '\0' && !isspace(*sep))
+               sep++;
+
+       if (*sep != '\0') {
+               last = sep + strlen(sep) - 1;
                while (last > walk && isspace(*last))
                        last--;
                *(last+1) = 0;
        }
 
-       *buf = walk;
+       return (sep);
 }
 
 static FILE *
@@ -167,7 +174,7 @@ cal_path(void)
 static int
 token(char *line, FILE *out, int *skip, int *unskip)
 {
-       char *walk, c, a;
+       char *walk, *sep, a, c;
        const char *this_cal_home;
        const char *this_cal_dir;
        const char *this_cal_file;
@@ -188,14 +195,20 @@ token(char *line, FILE *out, int *skip, int *unskip)
 
        if (strncmp(line, "ifdef", 5) == 0) {
                walk = line + 5;
-               trimlr(&walk);
+               sep = trimlr(&walk);
 
                if (*walk == '\0') {
                        WARN0("Expecting arguments after #ifdef");
                        return (T_ERR);
                }
+               if (*sep != '\0') {
+                       WARN1("Expecting a single word after #ifdef "
+                           "but got \"%s\"", walk);
+                       return (T_ERR);
+               }
 
-               if (*skip != 0 || definitions == NULL || sl_find(definitions, 
walk) == NULL)
+               if (*skip != 0 ||
+                   definitions == NULL || sl_find(definitions, walk) == NULL)
                        ++*skip;
                else
                        ++*unskip;
@@ -205,14 +218,20 @@ token(char *line, FILE *out, int *skip, int *unskip)
 
        if (strncmp(line, "ifndef", 6) == 0) {
                walk = line + 6;
-               trimlr(&walk);
+               sep = trimlr(&walk);
 
                if (*walk == '\0') {
                        WARN0("Expecting arguments after #ifndef");
                        return (T_ERR);
                }
+               if (*sep != '\0') {
+                       WARN1("Expecting a single word after #ifndef "
+                           "but got \"%s\"", walk);
+                       return (T_ERR);
+               }
 
-               if (*skip != 0 || (definitions != NULL && sl_find(definitions, 
walk) != NULL))
+               if (*skip != 0 ||
+                   (definitions != NULL && sl_find(definitions, walk) != NULL))
                        ++*skip;
                else
                        ++*unskip;
@@ -222,7 +241,7 @@ token(char *line, FILE *out, int *skip, int *unskip)
 
        if (strncmp(line, "else", 4) == 0) {
                walk = line + 4;
-               trimlr(&walk);
+               (void)trimlr(&walk);
 
                if (*walk != '\0') {
                        WARN0("Expecting no arguments after #else");
@@ -251,7 +270,7 @@ token(char *line, FILE *out, int *skip, int *unskip)
        if (strncmp(line, "include", 7) == 0) {
                walk = line + 7;
 
-               trimlr(&walk);
+               (void)trimlr(&walk);
 
                if (*walk == '\0') {
                        WARN0("Expecting arguments after #include");
@@ -291,7 +310,8 @@ token(char *line, FILE *out, int *skip, int *unskip)
                if (definitions == NULL)
                        definitions = sl_init();
                walk = line + 6;
-               trimlr(&walk);
+               sep = trimlr(&walk);
+               *sep = '\0';
 
                if (*walk == '\0') {
                        WARN0("Expecting arguments after #define");
@@ -306,10 +326,15 @@ token(char *line, FILE *out, int *skip, int *unskip)
        if (strncmp(line, "undef", 5) == 0) {
                if (definitions != NULL) {
                        walk = line + 5;
-                       trimlr(&walk);
+                       sep = trimlr(&walk);
 
                        if (*walk == '\0') {
                                WARN0("Expecting arguments after #undef");
+                               return (T_ERR);
+                       }
+                       if (*sep != '\0') {
+                               WARN1("Expecting a single word after #undef "
+                                   "but got \"%s\"", walk);
                                return (T_ERR);
                        }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to