81eb9cb
From 45ef10dd7b9d4337bfef9573803c1c7cadc012e6 Mon Sep 17 00:00:00 2001
81eb9cb
From: Phil Sutter <phil@nwl.cc>
81eb9cb
Date: Tue, 14 Aug 2018 14:18:06 +0200
81eb9cb
Subject: [PATCH] ss: Review ssfilter
81eb9cb
81eb9cb
The original problem was ssfilter rejecting single expressions if
81eb9cb
enclosed in braces, such as:
81eb9cb
81eb9cb
| sport = 22 or ( dport = 22 )
81eb9cb
81eb9cb
This is fixed by allowing 'expr' to be an 'exprlist' enclosed in braces.
81eb9cb
The no longer required recursion in 'exprlist' being an 'exprlist'
81eb9cb
enclosed in braces is dropped.
81eb9cb
81eb9cb
In addition to that, a few other things are changed:
81eb9cb
81eb9cb
* Remove pointless 'null' prefix in 'appled' before 'exprlist'.
81eb9cb
* For simple equals matches, '=' operator was required for ports but not
81eb9cb
  allowed for hosts. Make this consistent by making '=' operator
81eb9cb
  optional in both cases.
81eb9cb
81eb9cb
Reported-by: Samuel Mannehed <samuel@cendio.se>
81eb9cb
Fixes: b2038cc0b2403 ("ssfilter: Eliminate shift/reduce conflicts")
81eb9cb
Signed-off-by: Phil Sutter <phil@nwl.cc>
81eb9cb
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
81eb9cb
(cherry picked from commit 38d209ecf2ae966b9b25de4acb60cdffb0e06ced)
81eb9cb
Signed-off-by: Phil Sutter <psutter@redhat.com>
81eb9cb
---
81eb9cb
 misc/ssfilter.y | 36 +++++++++++++++++++++---------------
81eb9cb
 1 file changed, 21 insertions(+), 15 deletions(-)
81eb9cb
81eb9cb
diff --git a/misc/ssfilter.y b/misc/ssfilter.y
81eb9cb
index 88d4229a9b241..0413dddaa7584 100644
81eb9cb
--- a/misc/ssfilter.y
81eb9cb
+++ b/misc/ssfilter.y
81eb9cb
@@ -42,24 +42,22 @@ static void yyerror(char *s)
81eb9cb
 %nonassoc '!'
81eb9cb
 
81eb9cb
 %%
81eb9cb
-applet: null exprlist
81eb9cb
+applet: exprlist
81eb9cb
         {
81eb9cb
-                *yy_ret = $2;
81eb9cb
-                $$ = $2;
81eb9cb
+                *yy_ret = $1;
81eb9cb
+                $$ = $1;
81eb9cb
         }
81eb9cb
         | null
81eb9cb
         ;
81eb9cb
+
81eb9cb
 null:   /* NOTHING */ { $$ = NULL; }
81eb9cb
         ;
81eb9cb
+
81eb9cb
 exprlist: expr
81eb9cb
         | '!' expr
81eb9cb
         {
81eb9cb
                 $$ = alloc_node(SSF_NOT, $2);
81eb9cb
         }
81eb9cb
-        | '(' exprlist ')'
81eb9cb
-        {
81eb9cb
-                $$ = $2;
81eb9cb
-        }
81eb9cb
         | exprlist '|' expr
81eb9cb
         {
81eb9cb
                 $$ = alloc_node(SSF_OR, $1);
81eb9cb
@@ -77,13 +75,21 @@ exprlist: expr
81eb9cb
         }
81eb9cb
         ;
81eb9cb
 
81eb9cb
-expr:	DCOND HOSTCOND
81eb9cb
+eq:	'='
81eb9cb
+	| /* nothing */
81eb9cb
+	;
81eb9cb
+
81eb9cb
+expr:	'(' exprlist ')'
81eb9cb
+	{
81eb9cb
+		$$ = $2;
81eb9cb
+	}
81eb9cb
+	| DCOND eq HOSTCOND
81eb9cb
         {
81eb9cb
-		$$ = alloc_node(SSF_DCOND, $2);
81eb9cb
+		$$ = alloc_node(SSF_DCOND, $3);
81eb9cb
         }
81eb9cb
-        | SCOND HOSTCOND
81eb9cb
+        | SCOND eq HOSTCOND
81eb9cb
         {
81eb9cb
-		$$ = alloc_node(SSF_SCOND, $2);
81eb9cb
+		$$ = alloc_node(SSF_SCOND, $3);
81eb9cb
         }
81eb9cb
         | DPORT GEQ HOSTCOND
81eb9cb
         {
81eb9cb
@@ -101,7 +107,7 @@ expr:	DCOND HOSTCOND
81eb9cb
         {
81eb9cb
                 $$ = alloc_node(SSF_NOT, alloc_node(SSF_D_GE, $3));
81eb9cb
         }
81eb9cb
-        | DPORT '=' HOSTCOND
81eb9cb
+        | DPORT eq HOSTCOND
81eb9cb
         {
81eb9cb
 		$$ = alloc_node(SSF_DCOND, $3);
81eb9cb
         }
81eb9cb
@@ -126,7 +132,7 @@ expr:	DCOND HOSTCOND
81eb9cb
         {
81eb9cb
                 $$ = alloc_node(SSF_NOT, alloc_node(SSF_S_GE, $3));
81eb9cb
         }
81eb9cb
-        | SPORT '=' HOSTCOND
81eb9cb
+        | SPORT eq HOSTCOND
81eb9cb
         {
81eb9cb
 		$$ = alloc_node(SSF_SCOND, $3);
81eb9cb
         }
81eb9cb
@@ -134,7 +140,7 @@ expr:	DCOND HOSTCOND
81eb9cb
         {
81eb9cb
 		$$ = alloc_node(SSF_NOT, alloc_node(SSF_SCOND, $3));
81eb9cb
         }
81eb9cb
-        | DEVNAME '=' DEVCOND
81eb9cb
+        | DEVNAME eq DEVCOND
81eb9cb
         {
81eb9cb
 		$$ = alloc_node(SSF_DEVCOND, $3);
81eb9cb
         }
81eb9cb
@@ -142,7 +148,7 @@ expr:	DCOND HOSTCOND
81eb9cb
         {
81eb9cb
 		$$ = alloc_node(SSF_NOT, alloc_node(SSF_DEVCOND, $3));
81eb9cb
         }
81eb9cb
-        | FWMARK '=' MARKMASK
81eb9cb
+        | FWMARK eq MARKMASK
81eb9cb
         {
81eb9cb
                 $$ = alloc_node(SSF_MARKMASK, $3);
81eb9cb
         }
81eb9cb
-- 
81eb9cb
2.18.0
81eb9cb