lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210803170606.694085-15-rostedt@goodmis.org>
Date:   Tue,  3 Aug 2021 13:05:58 -0400
From:   Steven Rostedt <rostedt@...dmis.org>
To:     linux-trace-devel@...r.kernel.org
Cc:     linux-kernel@...r.kernel.org, Tom Zanussi <zanussi@...nel.org>,
        Daniel Bristot de Oliveira <bristot@...hat.com>,
        Masami Hiramatsu <mhiramat@...nel.org>,
        Namhyung Kim <namhyung@...nel.org>,
        linux-rt-users <linux-rt-users@...r.kernel.org>,
        Clark Williams <williams@...hat.com>,
        "Steven Rostedt (VMware)" <rostedt@...dmis.org>
Subject: [PATCH v3 14/22] libtracefs: Add error message for grouping events in SQL filter

From: "Steven Rostedt (VMware)" <rostedt@...dmis.org>

One requirement for the SQL filter in tracefs_sql() is that the WHERE
clause (filter) can only filter the FROM and JOIN events with "&&".

That is, you can not have:

  sched_switch.next_pid == 0 || sched_waking.pid == 0

As the filtering one event stops the synthetic event, having an ||
conjunction makes no sense.

Add an error message that explains this when it is found.

Signed-off-by: Steven Rostedt (VMware) <rostedt@...dmis.org>
---
 src/tracefs-sqlhist.c | 35 +++++++++++++++++++++++++----------
 1 file changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/tracefs-sqlhist.c b/src/tracefs-sqlhist.c
index acd3e0242d65..a0d934b4cd68 100644
--- a/src/tracefs-sqlhist.c
+++ b/src/tracefs-sqlhist.c
@@ -802,21 +802,36 @@ static int build_compare(struct tracefs_synth *synth,
 	return ret;
 }
 
-static int do_verify_filter(struct filter *filter,
+static int verify_filter_error(struct sqlhist_bison *sb, struct expr *expr,
+			       const char *event)
+{
+	struct field *field = &expr->field;
+
+	sb->line_no = expr->line;
+	sb->line_idx = expr->idx;
+
+	parse_error(sb, field->raw,
+		    "event '%s' can not be grouped or '||' together with '%s'\n"
+		    "All filters between '&&' must be for the same event\n",
+		    field->event, event);
+	return -1;
+}
+
+static int do_verify_filter(struct sqlhist_bison *sb, struct filter *filter,
 			    const char **system, const char **event)
 {
 	int ret;
 
 	if (filter->type == FILTER_OR ||
 	    filter->type == FILTER_AND) {
-		ret = do_verify_filter(&filter->lval->filter, system, event);
+		ret = do_verify_filter(sb, &filter->lval->filter, system, event);
 		if (ret)
 			return ret;
-		return do_verify_filter(&filter->rval->filter, system, event);
+		return do_verify_filter(sb, &filter->rval->filter, system, event);
 	}
 	if (filter->type == FILTER_GROUP ||
 	    filter->type == FILTER_NOT_GROUP) {
-		return do_verify_filter(&filter->lval->filter, system, event);
+		return do_verify_filter(sb, &filter->lval->filter, system, event);
 	}
 
 	/*
@@ -831,12 +846,12 @@ static int do_verify_filter(struct filter *filter,
 
 	if (filter->lval->field.system != *system ||
 	    filter->lval->field.event_name != *event)
-		return -1;
+		return verify_filter_error(sb, filter->lval, *event);
 
 	return 0;
 }
 
-static int verify_filter(struct filter *filter,
+static int verify_filter(struct sqlhist_bison *sb, struct filter *filter,
 			 const char **system, const char **event)
 {
 	int ret;
@@ -848,17 +863,17 @@ static int verify_filter(struct filter *filter,
 	case FILTER_NOT_GROUP:
 		break;
 	default:
-		return do_verify_filter(filter, system, event);
+		return do_verify_filter(sb, filter, system, event);
 	}
 
-	ret = do_verify_filter(&filter->lval->filter, system, event);
+	ret = do_verify_filter(sb, &filter->lval->filter, system, event);
 	if (ret)
 		return ret;
 
 	switch (filter->type) {
 	case FILTER_OR:
 	case FILTER_AND:
-		return do_verify_filter(&filter->rval->filter, system, event);
+		return do_verify_filter(sb, &filter->rval->filter, system, event);
 	default:
 		return 0;
 	}
@@ -1165,7 +1180,7 @@ static struct tracefs_synth *build_synth(struct tep_handle *tep,
 		bool *started;
 		bool start;
 
-		ret = verify_filter(&expr->filter, &filter_system,
+		ret = verify_filter(table->sb, &expr->filter, &filter_system,
 				    &filter_event);
 		if (ret < 0)
 			goto free;
-- 
2.30.2

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ