* [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 3/7] tracing/filters: Fix MATCH_END_ONLY filter matching
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
'foo', but tracing filter incorrectly disallows strings
matching regex expression ".*foo.*foo".
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.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 6d7b8f5..c6a0f8d 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
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
-- strict thread matches above, loose matches on Subject: below --
2010-01-14 2:52 [PATCH 0/7][RESEND] " Li Zefan
2010-01-14 2:53 ` [PATCH 3/7] tracing/filters: Fix MATCH_END_ONLY filter matching Li Zefan
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.