On Fri, 17 Jun 2016 12:38:41 -0400 Steven Rostedt <rost...@goodmis.org> wrote:
> On Wed, 1 Jun 2016 16:31:10 +0800 > zhengjun.x...@intel.com wrote: > > > From: xingzhen <zhengjun.x...@intel.com> > > > > 3debb0a9ddb adding a "__used" to the variable in the > > __trace_printk_fmt section. Sometimes it will cause > > *iter to be NULL, then strcmp in lookup_format and > > strcpy in hold_module_trace_bprintk_format will panic. > > Could you show an example of this happening? Ha! While adding a trace_printk() test module (to test someone else's change) I triggered this bug. > > > > > Signed-off-by: xingzhen <zhengjun.x...@intel.com> > > --- > > kernel/trace/trace_printk.c | 3 +++ > > 1 file changed, 3 insertions(+) > > > > diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c > > index f96f038..82ecfb5 100644 > > --- a/kernel/trace/trace_printk.c > > +++ b/kernel/trace/trace_printk.c > > @@ -55,6 +55,8 @@ void hold_module_trace_bprintk_format(const char **start, > > const char **end) > > > > mutex_lock(&btrace_mutex); > > for (iter = start; iter < end; iter++) { > > + if (!*iter) > > + goto err; > > struct trace_bprintk_fmt *tb_fmt = lookup_format(*iter); > > First, you can't place logic before a declaration. Not all compilers > will allow that. > > Also, do we really want to error on this or just skip it? Because it > will miss out on all other trace_printks in the module. I tried your patch and it works until you remove the module and try reading the trace again. As I said, you left out later processing. This should not exit on error. Below is a patch I wrote, and it works well. I'll add you as reported by. Thanks! -- Steve > > > > if (tb_fmt) { > > *iter = tb_fmt->fmt; > > @@ -75,6 +77,7 @@ void hold_module_trace_bprintk_format(const char **start, > > const char **end) > > *iter = fmt; > > > > } > > +err: > > mutex_unlock(&btrace_mutex); > > } > > > diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c index f96f0383f6c6..ad1d6164e946 100644 --- a/kernel/trace/trace_printk.c +++ b/kernel/trace/trace_printk.c @@ -36,6 +36,10 @@ struct trace_bprintk_fmt { static inline struct trace_bprintk_fmt *lookup_format(const char *fmt) { struct trace_bprintk_fmt *pos; + + if (!fmt) + return ERR_PTR(-EINVAL); + list_for_each_entry(pos, &trace_bprintk_fmt_list, list) { if (!strcmp(pos->fmt, fmt)) return pos; @@ -57,7 +61,8 @@ void hold_module_trace_bprintk_format(const char **start, const char **end) for (iter = start; iter < end; iter++) { struct trace_bprintk_fmt *tb_fmt = lookup_format(*iter); if (tb_fmt) { - *iter = tb_fmt->fmt; + if (!IS_ERR(tb_fmt)) + *iter = tb_fmt->fmt; continue; }