svn commit: r367292 - head/usr.bin/calendar

Stefan Eßer se at FreeBSD.org
Tue Nov 3 11:37:19 UTC 2020


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);
 			}
 


More information about the svn-src-head mailing list