Message ID | 170920576727.107552.638161246679734051.stgit@devnote2 (mailing list archive) |
---|---|
State | Accepted |
Commit | 6572786006fa96ad2c35bb31757f1f861298093b |
Headers | show |
Series | fprobe: Fix to allocate entry_data_size buffer with rethook instances | expand |
On Thu, 29 Feb 2024 20:22:47 +0900 "Masami Hiramatsu (Google)" <mhiramat@kernel.org> wrote: > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > Fix to allocate fprobe::entry_data_size buffer with rethook instances. > If fprobe doesn't allocate entry_data_size buffer for each rethook instance, > fprobe entry handler can cause a buffer overrun when storing entry data in > entry handler. > Oops, missed a URL. > Reported-by: Jiri Olsa <olsajiri@gmail.com> Closes: https://lore.kernel.org/all/Zd9eBn2FTQzYyg7L@krava/ Thanks, > Fixes: 4bbd93455659 ("kprobes: kretprobe scalability improvement") > Cc: stable@vger.kernel.org > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > --- > kernel/trace/fprobe.c | 14 ++++++-------- > 1 file changed, 6 insertions(+), 8 deletions(-) > > diff --git a/kernel/trace/fprobe.c b/kernel/trace/fprobe.c > index 6cd2a4e3afb8..9ff018245840 100644 > --- a/kernel/trace/fprobe.c > +++ b/kernel/trace/fprobe.c > @@ -189,9 +189,6 @@ static int fprobe_init_rethook(struct fprobe *fp, int num) > { > int size; > > - if (num <= 0) > - return -EINVAL; > - > if (!fp->exit_handler) { > fp->rethook = NULL; > return 0; > @@ -199,15 +196,16 @@ static int fprobe_init_rethook(struct fprobe *fp, int num) > > /* Initialize rethook if needed */ > if (fp->nr_maxactive) > - size = fp->nr_maxactive; > + num = fp->nr_maxactive; > else > - size = num * num_possible_cpus() * 2; > - if (size <= 0) > + num *= num_possible_cpus() * 2; > + if (num <= 0) > return -EINVAL; > > + size = sizeof(struct fprobe_rethook_node) + fp->entry_data_size; > + > /* Initialize rethook */ > - fp->rethook = rethook_alloc((void *)fp, fprobe_exit_handler, > - sizeof(struct fprobe_rethook_node), size); > + fp->rethook = rethook_alloc((void *)fp, fprobe_exit_handler, size, num); > if (IS_ERR(fp->rethook)) > return PTR_ERR(fp->rethook); > > >
On Thu, Feb 29, 2024 at 08:22:47PM +0900, Masami Hiramatsu (Google) wrote: > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > Fix to allocate fprobe::entry_data_size buffer with rethook instances. > If fprobe doesn't allocate entry_data_size buffer for each rethook instance, > fprobe entry handler can cause a buffer overrun when storing entry data in > entry handler. > > Reported-by: Jiri Olsa <olsajiri@gmail.com> Tested-by: Jiri Olsa <olsajiri@gmail.com> thanks, jirka > Fixes: 4bbd93455659 ("kprobes: kretprobe scalability improvement") > Cc: stable@vger.kernel.org > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > --- > kernel/trace/fprobe.c | 14 ++++++-------- > 1 file changed, 6 insertions(+), 8 deletions(-) > > diff --git a/kernel/trace/fprobe.c b/kernel/trace/fprobe.c > index 6cd2a4e3afb8..9ff018245840 100644 > --- a/kernel/trace/fprobe.c > +++ b/kernel/trace/fprobe.c > @@ -189,9 +189,6 @@ static int fprobe_init_rethook(struct fprobe *fp, int num) > { > int size; > > - if (num <= 0) > - return -EINVAL; > - > if (!fp->exit_handler) { > fp->rethook = NULL; > return 0; > @@ -199,15 +196,16 @@ static int fprobe_init_rethook(struct fprobe *fp, int num) > > /* Initialize rethook if needed */ > if (fp->nr_maxactive) > - size = fp->nr_maxactive; > + num = fp->nr_maxactive; > else > - size = num * num_possible_cpus() * 2; > - if (size <= 0) > + num *= num_possible_cpus() * 2; > + if (num <= 0) > return -EINVAL; > > + size = sizeof(struct fprobe_rethook_node) + fp->entry_data_size; > + > /* Initialize rethook */ > - fp->rethook = rethook_alloc((void *)fp, fprobe_exit_handler, > - sizeof(struct fprobe_rethook_node), size); > + fp->rethook = rethook_alloc((void *)fp, fprobe_exit_handler, size, num); > if (IS_ERR(fp->rethook)) > return PTR_ERR(fp->rethook); > >
On Thu, 29 Feb 2024 22:58:54 +0100 Jiri Olsa <olsajiri@gmail.com> wrote: > On Thu, Feb 29, 2024 at 08:22:47PM +0900, Masami Hiramatsu (Google) wrote: > > From: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > > > Fix to allocate fprobe::entry_data_size buffer with rethook instances. > > If fprobe doesn't allocate entry_data_size buffer for each rethook instance, > > fprobe entry handler can cause a buffer overrun when storing entry data in > > entry handler. > > > > Reported-by: Jiri Olsa <olsajiri@gmail.com> > > Tested-by: Jiri Olsa <olsajiri@gmail.com> Thanks for testing! Let me pick this to probe/fixes. Thank you, > > thanks, > jirka > > > Fixes: 4bbd93455659 ("kprobes: kretprobe scalability improvement") > > Cc: stable@vger.kernel.org > > Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org> > > --- > > kernel/trace/fprobe.c | 14 ++++++-------- > > 1 file changed, 6 insertions(+), 8 deletions(-) > > > > diff --git a/kernel/trace/fprobe.c b/kernel/trace/fprobe.c > > index 6cd2a4e3afb8..9ff018245840 100644 > > --- a/kernel/trace/fprobe.c > > +++ b/kernel/trace/fprobe.c > > @@ -189,9 +189,6 @@ static int fprobe_init_rethook(struct fprobe *fp, int num) > > { > > int size; > > > > - if (num <= 0) > > - return -EINVAL; > > - > > if (!fp->exit_handler) { > > fp->rethook = NULL; > > return 0; > > @@ -199,15 +196,16 @@ static int fprobe_init_rethook(struct fprobe *fp, int num) > > > > /* Initialize rethook if needed */ > > if (fp->nr_maxactive) > > - size = fp->nr_maxactive; > > + num = fp->nr_maxactive; > > else > > - size = num * num_possible_cpus() * 2; > > - if (size <= 0) > > + num *= num_possible_cpus() * 2; > > + if (num <= 0) > > return -EINVAL; > > > > + size = sizeof(struct fprobe_rethook_node) + fp->entry_data_size; > > + > > /* Initialize rethook */ > > - fp->rethook = rethook_alloc((void *)fp, fprobe_exit_handler, > > - sizeof(struct fprobe_rethook_node), size); > > + fp->rethook = rethook_alloc((void *)fp, fprobe_exit_handler, size, num); > > if (IS_ERR(fp->rethook)) > > return PTR_ERR(fp->rethook); > > > >
diff --git a/kernel/trace/fprobe.c b/kernel/trace/fprobe.c index 6cd2a4e3afb8..9ff018245840 100644 --- a/kernel/trace/fprobe.c +++ b/kernel/trace/fprobe.c @@ -189,9 +189,6 @@ static int fprobe_init_rethook(struct fprobe *fp, int num) { int size; - if (num <= 0) - return -EINVAL; - if (!fp->exit_handler) { fp->rethook = NULL; return 0; @@ -199,15 +196,16 @@ static int fprobe_init_rethook(struct fprobe *fp, int num) /* Initialize rethook if needed */ if (fp->nr_maxactive) - size = fp->nr_maxactive; + num = fp->nr_maxactive; else - size = num * num_possible_cpus() * 2; - if (size <= 0) + num *= num_possible_cpus() * 2; + if (num <= 0) return -EINVAL; + size = sizeof(struct fprobe_rethook_node) + fp->entry_data_size; + /* Initialize rethook */ - fp->rethook = rethook_alloc((void *)fp, fprobe_exit_handler, - sizeof(struct fprobe_rethook_node), size); + fp->rethook = rethook_alloc((void *)fp, fprobe_exit_handler, size, num); if (IS_ERR(fp->rethook)) return PTR_ERR(fp->rethook);