[PATCH 1/5] tracing/events: don't increment @pos in s_start()



While testing syscall tracepoints posted by Jason, I found 3 entries
were missing when reading available_events. The output size of
available_events is < 4 pages, which means we lost 1 item per page.

The cause is, it's wrong to increment @pos in s_start().

Actually there's another bug here -- reading avaiable_events/set_events
can race with module unload:

# cat available_events |
s_start() |
s_stop() |
| # rmmod foo.ko
s_start() |
call = list_entry(m->private) |

@call might be freed and accessing it will lead to crash.

[ Impact fix missing entries when reading available_events/set_events ]

Signed-off-by: Li Zefan <lizf@xxxxxxxxxxxxxx>
---
kernel/trace/trace_events.c | 28 ++++++++++++++++++++++------
1 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c
index aa341ff..4ab596e 100644
--- a/kernel/trace/trace_events.c
+++ b/kernel/trace/trace_events.c
@@ -300,10 +300,18 @@ t_next(struct seq_file *m, void *v, loff_t *pos)

static void *t_start(struct seq_file *m, loff_t *pos)
{
+ struct ftrace_event_call *call = NULL;
+ loff_t l;
+
mutex_lock(&event_mutex);
- if (*pos == 0)
- m->private = ftrace_events.next;
- return t_next(m, NULL, pos);
+
+ m->private = ftrace_events.next;
+ for (l = 0; l <= *pos; ) {
+ call = t_next(m, NULL, &l);
+ if (!call)
+ break;
+ }
+ return call;
}

static void *
@@ -332,10 +340,18 @@ s_next(struct seq_file *m, void *v, loff_t *pos)

static void *s_start(struct seq_file *m, loff_t *pos)
{
+ struct ftrace_event_call *call = NULL;
+ loff_t l;
+
mutex_lock(&event_mutex);
- if (*pos == 0)
- m->private = ftrace_events.next;
- return s_next(m, NULL, pos);
+
+ m->private = ftrace_events.next;
+ for (l = 0; l <= *pos; ) {
+ call = s_next(m, NULL, &l);
+ if (!call)
+ break;
+ }
+ return call;
}

static int t_show(struct seq_file *m, void *v)
--
1.5.4.rc3



--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



Relevant Pages

  • [PATCH 1/7] tracing/events: dont increment @pos in s_start()
    ... While testing syscall tracepoints posted by Jason, I found 3 entries ... were missing when reading available_events. ...
    (Linux-Kernel)
  • Re: Getting the list of Autocorrect enties in word
    ... the auto-correct entries of Office Word 2003 into a text file with a C# ... application.Quit(ref missing, ref missing, ref missing); ... entry = application.AutoCorrect.Entries.get_Item(ref ... other Windows Installer aware setup editor. ...
    (microsoft.public.dotnet.general)
  • S16 New Rankings Contest Week 8 call for entries and standings
    ... This thread is the call for entries for the fourth week of the New Rankings Contest. ... Jason W. ... Horny Goat - Cirie, Ami, Jason*, Erik, Eliza, Natalie, Alexis, James, ...
    (alt.tv.survivor)
  • Re: AutoCorrect in Office 2007
    ... Jay. ... How about in Excel or Powerpoint, are the entries missing there, as well? ... AutoCorrect is stored in *.acl files. ...
    (microsoft.public.word.docmanagement)
  • Re: Even **MORE** Really Bad Crossover Ideas
    ... After reading some of the entries in this thread, ... little surprised that noone posted entries like 'Samurai Gunsmith Pizza ... baskets if he can bring seven pesky patrons to the ranger station before ... betrothed to a student of a rival ...
    (rec.arts.anime.misc)