linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/7] tracing: Fix bugs in string filters.
@ 2009-12-14  3:57 Li Zefan
  2009-12-14  3:57 ` [PATCH 1/7] ftrace: Fix MATCH_END_ONLY function filter Li Zefan
                   ` (7 more replies)
  0 siblings, 8 replies; 11+ messages in thread
From: Li Zefan @ 2009-12-14  3:57 UTC (permalink / raw)
  To: Steven Rostedt, Ingo Molnar; +Cc: Frederic Weisbecker, Wenji Huang, LKML

This patchset fixes some bugs in string filters.

A new string helper strnstr() is introduced, to be used in
middle matching callback.

Also I add some comments to mainly explain why we should use
length-limited version of strstr() and strcmp().

---
 include/linux/string.h             |    5 ++++-
 kernel/trace/ftrace.c              |    6 +++---
 kernel/trace/trace_events_filter.c |   29 ++++++++++++++++++++---------
 lib/string.c                       |   27 ++++++++++++++++++++++++++-
 4 files changed, 53 insertions(+), 14 deletions(-)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/7] ftrace: Fix MATCH_END_ONLY function filter
  2009-12-14  3:57 [PATCH 0/7] tracing: Fix bugs in string filters Li Zefan
@ 2009-12-14  3:57 ` Li Zefan
  2009-12-14  3:57 ` [PATCH 2/7] tracing/filters: Fix MATCH_FRONT_ONLY filter matching Li Zefan
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Li Zefan @ 2009-12-14  3:57 UTC (permalink / raw)
  To: Steven Rostedt, Ingo Molnar; +Cc: Frederic Weisbecker, Wenji Huang, LKML

For '*foo' pattern, we should allow any string ending with
'foo', but ftrace filter incorrectly disallows strings
like bar_foo_foo:

  # echo '*io' > set_ftrace_filter
  # cat set_ftrace_filter | grep 'req_bio_endio'
  # cat available_filter_functions | grep 'req_bio_endio'
  req_bio_endio

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
---
 kernel/trace/ftrace.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index e51a1bc..3216ed6 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1690,7 +1690,7 @@ ftrace_regex_lseek(struct file *file, loff_t offset, int origin)
 static int ftrace_match(char *str, char *regex, int len, int type)
 {
 	int matched = 0;
-	char *ptr;
+	int slen;
 
 	switch (type) {
 	case MATCH_FULL:
@@ -1706,8 +1706,8 @@ static int ftrace_match(char *str, char *regex, int len, int type)
 			matched = 1;
 		break;
 	case MATCH_END_ONLY:
-		ptr = strstr(str, regex);
-		if (ptr && (ptr[len] == 0))
+		slen = strlen(str);
+		if (slen >= len && memcmp(str + slen - len, regex, len) == 0)
 			matched = 1;
 		break;
 	}
-- 
1.6.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/7] tracing/filters: Fix MATCH_FRONT_ONLY filter matching
  2009-12-14  3:57 [PATCH 0/7] tracing: Fix bugs in string filters Li Zefan
  2009-12-14  3:57 ` [PATCH 1/7] ftrace: Fix MATCH_END_ONLY function filter Li Zefan
@ 2009-12-14  3:57 ` Li Zefan
  2009-12-14  3:57 ` [PATCH 3/7] tracing/filters: Fix MATCH_END_ONLY " Li Zefan
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Li Zefan @ 2009-12-14  3:57 UTC (permalink / raw)
  To: Steven Rostedt, Ingo Molnar; +Cc: Frederic Weisbecker, Wenji Huang, LKML

MATCH_FRONT_ONLY actually is a full matching.

We should pass the length of the pattern string to strncmp().

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
---
 kernel/trace/trace_events_filter.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 50504cb..11c3973 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -261,7 +261,7 @@ static int regex_match_full(char *str, struct regex *r, int len)
 
 static int regex_match_front(char *str, struct regex *r, int len)
 {
-	if (strncmp(str, r->pattern, len) == 0)
+	if (strncmp(str, r->pattern, r->len) == 0)
 		return 1;
 	return 0;
 }
-- 
1.6.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/7] tracing/filters: Fix MATCH_END_ONLY filter matching
  2009-12-14  3:57 [PATCH 0/7] tracing: Fix bugs in string filters Li Zefan
  2009-12-14  3:57 ` [PATCH 1/7] ftrace: Fix MATCH_END_ONLY function filter Li Zefan
  2009-12-14  3:57 ` [PATCH 2/7] tracing/filters: Fix MATCH_FRONT_ONLY filter matching Li Zefan
@ 2009-12-14  3:57 ` Li Zefan
  2009-12-14  3:58 ` [PATCH 4/7] lib: Introduce strnstr() Li Zefan
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Li Zefan @ 2009-12-14  3:57 UTC (permalink / raw)
  To: Steven Rostedt, Ingo Molnar; +Cc: Frederic Weisbecker, Wenji Huang, LKML

For '*foo' pattern, we should allow any string ending with
'foo', but tracing filter incorrectly disallows strings
matching regex expression ".*foo.*foo".

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
---
 kernel/trace/trace_events_filter.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 11c3973..49e44dd 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -275,9 +275,10 @@ static int regex_match_middle(char *str, struct regex *r, int len)
 
 static int regex_match_end(char *str, struct regex *r, int len)
 {
-	char *ptr = strstr(str, r->pattern);
+	int strlen = len - 1;
 
-	if (ptr && (ptr[r->len] == 0))
+	if (strlen >= r->len &&
+	    memcmp(str + strlen - r->len, r->pattern, r->len) == 0)
 		return 1;
 	return 0;
 }
-- 
1.6.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 4/7] lib: Introduce strnstr()
  2009-12-14  3:57 [PATCH 0/7] tracing: Fix bugs in string filters Li Zefan
                   ` (2 preceding siblings ...)
  2009-12-14  3:57 ` [PATCH 3/7] tracing/filters: Fix MATCH_END_ONLY " Li Zefan
@ 2009-12-14  3:58 ` Li Zefan
  2009-12-14  3:58 ` [PATCH 5/7] tracing/filters: Fix MATCH_MIDDLE_ONLY filter matching Li Zefan
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Li Zefan @ 2009-12-14  3:58 UTC (permalink / raw)
  To: Steven Rostedt, Ingo Molnar; +Cc: Frederic Weisbecker, Wenji Huang, LKML

It differs strstr() in that it limits the length to be searched
in the first string.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
---
 include/linux/string.h |    5 ++++-
 lib/string.c           |   27 ++++++++++++++++++++++++++-
 2 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/include/linux/string.h b/include/linux/string.h
index b850886..fa6a5ba 100644
--- a/include/linux/string.h
+++ b/include/linux/string.h
@@ -64,7 +64,10 @@ extern char * strrchr(const char *,int);
 #endif
 extern char * __must_check strstrip(char *);
 #ifndef __HAVE_ARCH_STRSTR
-extern char * strstr(const char *,const char *);
+extern char * strstr(const char *, const char *);
+#endif
+#ifndef __HAVE_ARCH_STRNSTR
+extern char * strnstr(const char *, const char *, size_t);
 #endif
 #ifndef __HAVE_ARCH_STRLEN
 extern __kernel_size_t strlen(const char *);
diff --git a/lib/string.c b/lib/string.c
index e96421a..a5fff51 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -656,7 +656,7 @@ EXPORT_SYMBOL(memscan);
  */
 char *strstr(const char *s1, const char *s2)
 {
-	int l1, l2;
+	size_t l1, l2;
 
 	l2 = strlen(s2);
 	if (!l2)
@@ -673,6 +673,31 @@ char *strstr(const char *s1, const char *s2)
 EXPORT_SYMBOL(strstr);
 #endif
 
+#ifndef __HAVE_ARCH_STRNSTR
+/**
+ * strnstr - Find the first substring in a length-limited string
+ * @s1: The string to be searched
+ * @s2: The string to search for
+ * @len: the maximum number of characters to search
+ */
+char *strnstr(const char *s1, const char *s2, size_t len)
+{
+	size_t l1 = len, l2;
+
+	l2 = strlen(s2);
+	if (!l2)
+		return (char *)s1;
+	while (l1 >= l2) {
+		l1--;
+		if (!memcmp(s1, s2, l2))
+			return (char *)s1;
+		s1++;
+	}
+	return NULL;
+}
+EXPORT_SYMBOL(strnstr);
+#endif
+
 #ifndef __HAVE_ARCH_MEMCHR
 /**
  * memchr - Find a character in an area of memory.
-- 
1.6.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 5/7] tracing/filters: Fix MATCH_MIDDLE_ONLY filter matching
  2009-12-14  3:57 [PATCH 0/7] tracing: Fix bugs in string filters Li Zefan
                   ` (3 preceding siblings ...)
  2009-12-14  3:58 ` [PATCH 4/7] lib: Introduce strnstr() Li Zefan
@ 2009-12-14  3:58 ` Li Zefan
  2009-12-14  3:58 ` [PATCH 6/7] tracing/filters: Fix MATCH_END_ONLY filter matching for PTR_STRING Li Zefan
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Li Zefan @ 2009-12-14  3:58 UTC (permalink / raw)
  To: Steven Rostedt, Ingo Molnar; +Cc: Frederic Weisbecker, Wenji Huang, LKML

The @str might not be NULL-terminated if it's of type
DYN_STRING or STATIC_STRING, so we should use strnstr()
instead of strstr().

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
---
 kernel/trace/trace_events_filter.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 49e44dd..f364b08 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -268,7 +268,7 @@ static int regex_match_front(char *str, struct regex *r, int len)
 
 static int regex_match_middle(char *str, struct regex *r, int len)
 {
-	if (strstr(str, r->pattern))
+	if (strnstr(str, r->pattern, len))
 		return 1;
 	return 0;
 }
-- 
1.6.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 6/7] tracing/filters: Fix MATCH_END_ONLY filter matching for PTR_STRING
  2009-12-14  3:57 [PATCH 0/7] tracing: Fix bugs in string filters Li Zefan
                   ` (4 preceding siblings ...)
  2009-12-14  3:58 ` [PATCH 5/7] tracing/filters: Fix MATCH_MIDDLE_ONLY filter matching Li Zefan
@ 2009-12-14  3:58 ` Li Zefan
  2009-12-14  3:59 ` [PATCH 7/7] tracing/filters: Add comment for match callbacks Li Zefan
  2009-12-14 12:39 ` [PATCH 0/7] tracing: Fix bugs in string filters Frederic Weisbecker
  7 siblings, 0 replies; 11+ messages in thread
From: Li Zefan @ 2009-12-14  3:58 UTC (permalink / raw)
  To: Steven Rostedt, Ingo Molnar; +Cc: Frederic Weisbecker, Wenji Huang, LKML

MATCH_FULL matching for PTR_STRING is not working correctly:

  # echo 'func == vt' > events/bkl/lock_kernel/filter
  # echo 1 > events/bkl/lock_kernel/enable
  ...
  # cat trace
   Xorg-1484  [000]  1973.392586: lock_kernel: ... func=vt_ioctl()
    gpm-1402  [001]  1974.027740: lock_kernel: ... func=vt_ioctl()

We should pass to regex.match(..., len) the length (including '\0')
of the source string instead of the length of the pattern string.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
---
 kernel/trace/trace_events_filter.c |    7 +++----
 1 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index f364b08..60c2a4e 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -211,8 +211,9 @@ static int filter_pred_pchar(struct filter_pred *pred, void *event,
 {
 	char **addr = (char **)(event + pred->offset);
 	int cmp, match;
+	int len = strlen(*addr) + 1;	/* including tailing '\0' */
 
-	cmp = pred->regex.match(*addr, &pred->regex, pred->regex.field_len);
+	cmp = pred->regex.match(*addr, &pred->regex, len);
 
 	match = cmp ^ pred->not;
 
@@ -782,10 +783,8 @@ static int filter_add_pred(struct filter_parse_state *ps,
 			pred->regex.field_len = field->size;
 		} else if (field->filter_type == FILTER_DYN_STRING)
 			fn = filter_pred_strloc;
-		else {
+		else
 			fn = filter_pred_pchar;
-			pred->regex.field_len = strlen(pred->regex.pattern);
-		}
 	} else {
 		if (field->is_signed)
 			ret = strict_strtoll(pred->regex.pattern, 0, &val);
-- 
1.6.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 7/7] tracing/filters: Add comment for match callbacks
  2009-12-14  3:57 [PATCH 0/7] tracing: Fix bugs in string filters Li Zefan
                   ` (5 preceding siblings ...)
  2009-12-14  3:58 ` [PATCH 6/7] tracing/filters: Fix MATCH_END_ONLY filter matching for PTR_STRING Li Zefan
@ 2009-12-14  3:59 ` Li Zefan
  2009-12-14 12:39 ` [PATCH 0/7] tracing: Fix bugs in string filters Frederic Weisbecker
  7 siblings, 0 replies; 11+ messages in thread
From: Li Zefan @ 2009-12-14  3:59 UTC (permalink / raw)
  To: Steven Rostedt, Ingo Molnar; +Cc: Frederic Weisbecker, Wenji Huang, LKML

We should be clear on 2 things:

- the length parameter of a match callback includes
  tailing '\0'.

- the string to be searched might not be NULL-terminated.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
---
 kernel/trace/trace_events_filter.c |   13 ++++++++++++-
 1 files changed, 12 insertions(+), 1 deletions(-)

diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 60c2a4e..e42af9a 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -252,7 +252,18 @@ static int filter_pred_none(struct filter_pred *pred, void *event,
 	return 0;
 }
 
-/* Basic regex callbacks */
+/*
+ * regex_match_foo - Basic regex callbacks
+ *
+ * @str: the string to be searched
+ * @r:   the regex structure containing the pattern string
+ * @len: the length of the string to be searched (including '\0')
+ *
+ * Note:
+ * - @str might not be NULL-terminated if it's of type DYN_STRING
+ *   or STATIC_STRING
+ */
+
 static int regex_match_full(char *str, struct regex *r, int len)
 {
 	if (strncmp(str, r->pattern, len) == 0)
-- 
1.6.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/7] tracing: Fix bugs in string filters.
  2009-12-14  3:57 [PATCH 0/7] tracing: Fix bugs in string filters Li Zefan
                   ` (6 preceding siblings ...)
  2009-12-14  3:59 ` [PATCH 7/7] tracing/filters: Add comment for match callbacks Li Zefan
@ 2009-12-14 12:39 ` Frederic Weisbecker
  2009-12-21  1:28   ` Li Zefan
  7 siblings, 1 reply; 11+ messages in thread
From: Frederic Weisbecker @ 2009-12-14 12:39 UTC (permalink / raw)
  To: Li Zefan; +Cc: Steven Rostedt, Ingo Molnar, Wenji Huang, LKML

On Mon, Dec 14, 2009 at 11:57:11AM +0800, Li Zefan wrote:
> This patchset fixes some bugs in string filters.
> 
> A new string helper strnstr() is introduced, to be used in
> middle matching callback.
> 
> Also I add some comments to mainly explain why we should use
> length-limited version of strstr() and strcmp().
> 
> ---
>  include/linux/string.h             |    5 ++++-
>  kernel/trace/ftrace.c              |    6 +++---
>  kernel/trace/trace_events_filter.c |   29 ++++++++++++++++++++---------
>  lib/string.c                       |   27 ++++++++++++++++++++++++++-
>  4 files changed, 53 insertions(+), 14 deletions(-)


Looks pretty good.

Acked-by: Frederic Weisbecker <fweisbec@gmail.com>

Thanks!


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 0/7] tracing: Fix bugs in string filters.
  2009-12-14 12:39 ` [PATCH 0/7] tracing: Fix bugs in string filters Frederic Weisbecker
@ 2009-12-21  1:28   ` Li Zefan
  0 siblings, 0 replies; 11+ messages in thread
From: Li Zefan @ 2009-12-21  1:28 UTC (permalink / raw)
  To: Steven Rostedt; +Cc: Frederic Weisbecker, Ingo Molnar, Wenji Huang, LKML

Frederic Weisbecker wrote:
> On Mon, Dec 14, 2009 at 11:57:11AM +0800, Li Zefan wrote:
>> This patchset fixes some bugs in string filters.
>>
>> A new string helper strnstr() is introduced, to be used in
>> middle matching callback.
>>
>> Also I add some comments to mainly explain why we should use
>> length-limited version of strstr() and strcmp().
>>
>> ---
>>  include/linux/string.h             |    5 ++++-
>>  kernel/trace/ftrace.c              |    6 +++---
>>  kernel/trace/trace_events_filter.c |   29 ++++++++++++++++++++---------
>>  lib/string.c                       |   27 ++++++++++++++++++++++++++-
>>  4 files changed, 53 insertions(+), 14 deletions(-)
> 
> 
> Looks pretty good.
> 
> Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
> 

Hi Steven, could you pick up those patches?


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/7] ftrace: Fix MATCH_END_ONLY function filter
  2010-01-14  2:52 [PATCH 0/7][RESEND] " Li Zefan
@ 2010-01-14  2:53 ` Li Zefan
  0 siblings, 0 replies; 11+ messages in thread
From: Li Zefan @ 2010-01-14  2:53 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Steven Rostedt, Frederic Weisbecker, LKML

For '*foo' pattern, we should allow any string ending with
'foo', but ftrace filter incorrectly disallows strings
like bar_foo_foo:

  # echo '*io' > set_ftrace_filter
  # cat set_ftrace_filter | grep 'req_bio_endio'
  # cat available_filter_functions | grep 'req_bio_endio'
  req_bio_endio

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
---
 kernel/trace/ftrace.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 7968762..1e6640f 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1690,7 +1690,7 @@ ftrace_regex_lseek(struct file *file, loff_t offset, int origin)
 static int ftrace_match(char *str, char *regex, int len, int type)
 {
 	int matched = 0;
-	char *ptr;
+	int slen;
 
 	switch (type) {
 	case MATCH_FULL:
@@ -1706,8 +1706,8 @@ static int ftrace_match(char *str, char *regex, int len, int type)
 			matched = 1;
 		break;
 	case MATCH_END_ONLY:
-		ptr = strstr(str, regex);
-		if (ptr && (ptr[len] == 0))
+		slen = strlen(str);
+		if (slen >= len && memcmp(str + slen - len, regex, len) == 0)
 			matched = 1;
 		break;
 	}
-- 
1.6.3


^ permalink raw reply related	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2010-01-14  2:53 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-12-14  3:57 [PATCH 0/7] tracing: Fix bugs in string filters Li Zefan
2009-12-14  3:57 ` [PATCH 1/7] ftrace: Fix MATCH_END_ONLY function filter Li Zefan
2009-12-14  3:57 ` [PATCH 2/7] tracing/filters: Fix MATCH_FRONT_ONLY filter matching Li Zefan
2009-12-14  3:57 ` [PATCH 3/7] tracing/filters: Fix MATCH_END_ONLY " Li Zefan
2009-12-14  3:58 ` [PATCH 4/7] lib: Introduce strnstr() Li Zefan
2009-12-14  3:58 ` [PATCH 5/7] tracing/filters: Fix MATCH_MIDDLE_ONLY filter matching Li Zefan
2009-12-14  3:58 ` [PATCH 6/7] tracing/filters: Fix MATCH_END_ONLY filter matching for PTR_STRING Li Zefan
2009-12-14  3:59 ` [PATCH 7/7] tracing/filters: Add comment for match callbacks Li Zefan
2009-12-14 12:39 ` [PATCH 0/7] tracing: Fix bugs in string filters Frederic Weisbecker
2009-12-21  1:28   ` Li Zefan
2010-01-14  2:52 [PATCH 0/7][RESEND] " Li Zefan
2010-01-14  2:53 ` [PATCH 1/7] ftrace: Fix MATCH_END_ONLY function filter Li Zefan

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).